HEX
Server: Apache
System: Linux pdx1-shared-a1-38 6.6.104-grsec-jammy+ #3 SMP Tue Sep 16 00:28:11 UTC 2025 x86_64
User: mmickelson (3396398)
PHP: 8.1.31
Disabled: NONE
Upload Files
File: //usr/local/wp/vendor/wp-cli/media-command/features/media-import.feature
Feature: Manage WordPress attachments

  Background:
    Given a WP install

  Scenario: Import media from remote URL
    When I run `wp media import 'http://wp-cli.org/behat-data/codeispoetry.png' --post_id=1`
    Then STDOUT should contain:
      """
      Imported file 'http://wp-cli.org/behat-data/codeispoetry.png'
      """
    And STDOUT should contain:
      """
      Success: Imported 1 of 1 items.
      """

  Scenario: Import media from remote URL with query string
    When I run `wp media import 'https://dummyimage.com/350x150.jpg?text=Foo'`
    Then STDOUT should contain:
      """
      Imported file 'https://dummyimage.com/350x150.jpg?text=Foo' as attachment ID
      """
    And STDOUT should contain:
      """
      Success: Imported 1 of 1 items.
      """

  Scenario: Import media from remote URL and use input file as attachment name
    When I run `wp media import 'http://wp-cli.org/behat-data/codeispoetry.png' --file_name=abc`
    Then STDOUT should contain:
      """
      file name abc.png
      """
    And STDOUT should contain:
      """
      Success: Imported 1 of 1 items.
      """

  Scenario: Fail to import missing image
    When I try `wp media import gobbledygook.png`
    Then STDERR should be:
      """
      Warning: Unable to import file 'gobbledygook.png'. Reason: File doesn't exist.
      Error: No items imported.
      """
    And the return code should be 1

  Scenario: Fail to import missing item on Windows
    When I try `wp media import c:/path/gobbledygook.png`
    Then STDERR should be:
      """
      Warning: Unable to import file 'c:/path/gobbledygook.png'. Reason: File doesn't exist.
      Error: No items imported.
      """
    And the return code should be 1

  Scenario: Import a file as attachment from a local image
    Given download:
      | path                        | url                                              |
      | {CACHE_DIR}/large-image.jpg | http://wp-cli.org/behat-data/large-image.jpg     |

    When I run `wp media import {CACHE_DIR}/large-image.jpg --post_id=1 --featured_image`
    Then STDOUT should contain:
      """
      Imported file
      """
    And STDOUT should contain:
      """
      and attached to post 1 as featured image
      """
    And the {CACHE_DIR}/large-image.jpg file should exist
    And the return code should be 0

  Scenario: Import a file as attachment from a local image and preserve the file modified time.
    Given download:
      | path                        | url                                              |
      | {CACHE_DIR}/large-image.jpg | http://wp-cli.org/behat-data/large-image.jpg     |
    And I run `TZ=UTC touch -t 8001031305 {CACHE_DIR}/large-image.jpg`
    And I run `wp option update gmt_offset -5`

    When I run `wp media import {CACHE_DIR}/large-image.jpg --post_id=1 --preserve-filetime --porcelain`
    Then save STDOUT as {ATTACH_ID}

    When I run `wp post get {ATTACH_ID} --field=post_date`
    Then STDOUT should be:
      """
      1980-01-03 08:05:00
      """

    When I run `wp post get {ATTACH_ID} --field=post_date_gmt`
    Then STDOUT should be:
      """
      1980-01-03 13:05:00
      """

  Scenario: Import a file as an attachment but porcelain style
    Given download:
      | path                        | url                                              |
      | {CACHE_DIR}/large-image.jpg | http://wp-cli.org/behat-data/large-image.jpg     |

    When I run `wp media import {CACHE_DIR}/large-image.jpg --title="My imported attachment" --caption="My fabulous caption" --post_name="My post name" --porcelain`
    Then save STDOUT as {ATTACHMENT_ID}

    When I run `wp post get {ATTACHMENT_ID} --field=title`
    Then STDOUT should be:
      """
      My imported attachment
      """

    When I run `wp post get {ATTACHMENT_ID} --field=excerpt`
    Then STDOUT should be:
      """
      My fabulous caption
      """

    When I run `wp post get {ATTACHMENT_ID} --field=post_name`
    Then STDOUT should be:
      """
      my-post-name
      """

  Scenario: Import a file as attachment from a local image and leave it in it's current location
    Given download:
      | path                        | url                                              |
      | {CACHE_DIR}/large-image.jpg | http://wp-cli.org/behat-data/large-image.jpg     |
    And I run `wp option update uploads_use_yearmonth_folders 0`

    When I run `wp media import {CACHE_DIR}/large-image.jpg --skip-copy`
    Then STDOUT should contain:
      """
      Imported file
      """
    And STDOUT should contain:
      """
      Success: Imported 1 of 1 items.
      """
    And the {CACHE_DIR}/large-image.jpg file should exist
    And the wp-content/uploads/large-image.jpg file should not exist
    And the return code should be 0

  Scenario: Import a file and use its filename as the title
    Given download:
      | path                        | url                                              |
      | {CACHE_DIR}/large-image.jpg | http://wp-cli.org/behat-data/large-image.jpg     |

    When I run `wp media import {CACHE_DIR}/large-image.jpg --porcelain`
    Then save STDOUT as {ATTACHMENT_ID}

    When I run `wp post get {ATTACHMENT_ID} --field=title`
    Then STDOUT should be:
      """
      large-image
      """

  Scenario: Import a file and persist its original metadata
    Given download:
      | path                         | url                                              |
      | {CACHE_DIR}/canola.jpg       | http://wp-cli.org/behat-data/canola.jpg          |

    When I run `wp media import {CACHE_DIR}/canola.jpg --porcelain`
    Then save STDOUT as {ATTACHMENT_ID}

    When I run `wp post get {ATTACHMENT_ID} --field=title`
    Then STDOUT should be:
      """
      A field of amazing canola
      """

    When I run `wp post get {ATTACHMENT_ID} --field=excerpt`
    Then STDOUT should be:
      """
      The description for the image
      """

  Scenario: Make sure WordPress receives the slashed data it expects
    When I run `wp media import 'http://wp-cli.org/behat-data/codeispoetry.png' --post_id=1 --title='My\Title' --caption='Caption\Here' --alt='Alt\Here' --desc='Desc\Here' --porcelain`
    Then save STDOUT as {ATTACHMENT_ID}

    When I run `wp post get {ATTACHMENT_ID} --format=csv --fields=post_title,post_excerpt,post_content`
    Then STDOUT should contain:
      """
      post_content,"Desc\Here"
      post_title,"My\Title"
      post_excerpt,"Caption\Here"
      """

    When I run `wp post meta get {ATTACHMENT_ID} _wp_attachment_image_alt`
    Then STDOUT should be:
      """
      Alt\Here
      """

  Scenario: Import multiple images
    Given download:
      | path                        | url                                              |
      | {CACHE_DIR}/large-image.jpg | http://wp-cli.org/behat-data/large-image.jpg     |

    When I run `wp media import 'http://wp-cli.org/behat-data/codeispoetry.png' {CACHE_DIR}/large-image.jpg`
    Then STDOUT should contain:
      """
      Success: Imported 2 of 2 items.
      """

  Scenario: Fail to import one image but continue trying the next
    When I try `wp media import gobbledygook.png 'http://wp-cli.org/behat-data/codeispoetry.png'`
    Then STDERR should contain:
      """
      Error: Only imported 1 of 2 items.
      """
    And the return code should be 1

  Scenario: Fail when download_url() fails
    When I try `wp media import 'http://wp-cli.org/404'`
    Then STDERR should be:
      """
      Warning: Unable to import file 'http://wp-cli.org/404'. Reason: Not Found
      Error: No items imported.
      """
    And the return code should be 1

  Scenario: Return a non-zero exit code when encountering an error in --porcelain mode
    When I try `wp media import gobbledygook.png --porcelain`
    Then STDERR should contain:
      """
      Warning: Unable to import file 'gobbledygook.png'. Reason: File doesn't exist.
      """
    And the return code should be 1

  Scenario: Return upload URL after importing a single valid file
    Given download:
      | path                        | url                                              |
      | {CACHE_DIR}/large-image.jpg | http://wp-cli.org/behat-data/large-image.jpg     |

    When I run `wp media import {CACHE_DIR}/large-image.jpg --porcelain=url`
    Then STDOUT should contain:
      """
      https://example.com/wp-content/uploads/
      """

    And STDOUT should contain:
      """
      /large-image.jpg
      """

  Scenario: Return upload URL after importing a multiple valid files
    Given download:
      | path                                | url                                                  |
      | {CACHE_DIR}/large-image.jpg         | http://wp-cli.org/behat-data/large-image.jpg         |
      | {CACHE_DIR}/audio-with-no-cover.mp3 | http://wp-cli.org/behat-data/audio-with-no-cover.mp3 |

    When I run `wp media import 'http://wp-cli.org/behat-data/codeispoetry.png' {CACHE_DIR}/large-image.jpg {CACHE_DIR}/audio-with-no-cover.mp3 --porcelain=url`
    Then STDOUT should contain:
      """
      https://example.com/wp-content/uploads/
      """

    And STDOUT should contain:
      """
      /large-image.jpg
      """

    And STDOUT should contain:
      """
      /codeispoetry.png
      """

    And STDOUT should contain:
      """
      /audio-with-no-cover.mp3
      """

    And STDOUT should not contain:
      """
      Success:
      """

  Scenario: Errors when invalid --porcelain flag is applied.
    When I try `wp media import 'http://wp-cli.org/behat-data/codeispoetry.png' --porcelain=invalid`
    Then STDERR should be:
      """
      Error: Invalid value for <porcelain>: invalid. Expected flag or 'url'.
      """