Feature: Manage WordPress posts Background: Given a WP install Scenario: Creating/updating/deleting posts When I run `wp post create --post_title='Test post' --porcelain` Then STDOUT should be a number And save STDOUT as {POST_ID} When I run `wp post create --post_title='Test post' --post_type="test" --porcelain` Then STDOUT should be a number And save STDOUT as {CUSTOM_POST_ID} When I run `wp post exists {CUSTOM_POST_ID}` Then STDOUT should be: """ Success: Post with ID {CUSTOM_POST_ID} exists. """ And the return code should be 0 When I try `wp post exists 1000` And STDOUT should be empty And the return code should be 1 When I run `wp post update {POST_ID} --post_title='Updated post'` Then STDOUT should be: """ Success: Updated post {POST_ID}. """ When I run `wp post delete {POST_ID}` Then STDOUT should be: """ Success: Trashed post {POST_ID}. """ When I run the previous command again Then STDOUT should be: """ Success: Deleted post {POST_ID}. """ When I try `wp post delete {CUSTOM_POST_ID}` Then STDERR should be: """ Warning: Posts of type 'test' do not support being sent to trash. Please use the --force flag to skip trash and delete them permanently. """ When I run `wp post delete {CUSTOM_POST_ID} --force` Then STDOUT should be: """ Success: Deleted post {CUSTOM_POST_ID}. """ When I try the previous command again Then the return code should be 1 Scenario: Setting post categories When I run `wp term create category "First Category" --porcelain` And save STDOUT as {TERM_ID} And I run `wp term create category "Second Category" --porcelain` And save STDOUT as {SECOND_TERM_ID} When I run `wp post create --post_title="Test category" --post_category="First Category" --porcelain` Then STDOUT should be a number And save STDOUT as {POST_ID} When I run `wp post term list {POST_ID} category --field=term_id` Then STDOUT should be: """ {TERM_ID} """ When I run `wp post update {POST_ID} --post_category={SECOND_TERM_ID}` Then STDOUT should be: """ Success: Updated post {POST_ID}. """ When I run `wp post term list {POST_ID} category --field=term_id` Then STDOUT should be: """ {SECOND_TERM_ID} """ When I run `wp post update {POST_ID} --post_category='Uncategorized,{TERM_ID},Second Category'` Then STDOUT should be: """ Success: Updated post {POST_ID}. """ When I run `wp post term list {POST_ID} category --field=term_id` And save STDOUT as {MULTI_CATEGORIES_STDOUT} Then STDOUT should contain: """ {TERM_ID} """ And STDOUT should contain: """ {SECOND_TERM_ID} """ And STDOUT should contain: """ 1 """ # Blank categories with non-blank ignored. When I run `wp post update {POST_ID} --post_category='Uncategorized, ,{TERM_ID},Second Category,'` Then STDOUT should be: """ Success: Updated post {POST_ID}. """ When I run `wp post term list {POST_ID} category --field=term_id` Then STDOUT should be: """ {MULTI_CATEGORIES_STDOUT} """ # Zero category same as default Uncategorized (1) category. When I try `wp post update {POST_ID} --post_category=0` Then STDOUT should be: """ Success: Updated post {POST_ID}. """ When I run `wp post term list {POST_ID} category --field=term_id` Then STDOUT should be: """ 1 """ # Blank category/categories same as default Uncategorized (1) category. When I try `wp post update {POST_ID} --post_category=,` Then STDOUT should be: """ Success: Updated post {POST_ID}. """ When I run `wp post term list {POST_ID} category --field=term_id` Then STDOUT should be: """ 1 """ # Null category same as no categories. When I try `wp post update {POST_ID} --post_category=' '` Then STDOUT should be: """ Success: Updated post {POST_ID}. """ When I run `wp post term list {POST_ID} category --field=term_id` Then STDOUT should be empty # Non-existent category. When I try `wp post update {POST_ID} --post_category=test` Then STDERR should be: """ Error: No such post category 'test'. """ When I try `wp post create --post_title="Non-existent Category" --post_category={SECOND_TERM_ID},Test --porcelain` Then STDERR should be: """ Error: No such post category 'Test'. """ # Error on first non-existent category found. When I try `wp post create --post_title="More than one non-existent Category" --post_category={SECOND_TERM_ID},Test,Bad --porcelain` Then STDERR should be: """ Error: No such post category 'Test'. """ Scenario: Creating/getting/editing posts Given a content.html file: """ This is some content. """ And a create-post.sh file: """ cat content.html | wp post create --post_title='Test post' --post_excerpt="A multiline excerpt" --porcelain - """ When I run `bash create-post.sh` Then STDOUT should be a number And save STDOUT as {POST_ID} When I run `wp post get --field=excerpt {POST_ID}` Then STDOUT should be: """ A multiline excerpt """ When I run `wp post get --field=content {POST_ID} | diff -Bu content.html -` Then STDOUT should be empty When I run `wp post get --format=table {POST_ID}` Then STDOUT should be a table containing rows: | Field | Value | | ID | {POST_ID} | | post_title | Test post | | post_name | | | post_type | post | When I run `wp post get {POST_ID} --format=csv --fields=post_title,type | wc -l | tr -d ' '` Then STDOUT should be: """ 3 """ When I run `wp post get --format=json {POST_ID}` Then STDOUT should be JSON containing: """ { "ID": {POST_ID}, "post_title": "Test post" } """ When I try `EDITOR='ex -i NONE -c q!' wp post edit {POST_ID}` Then STDERR should contain: """ No change made to post content. """ And the return code should be 0 When I run `EDITOR='ex -i NONE -c %s/content/bunkum -c wq' wp post edit {POST_ID}` Then STDERR should be empty Then STDOUT should contain: """ Updated post {POST_ID}. """ When I run `wp post get --field=content {POST_ID}` Then STDOUT should contain: """ This is some bunkum. """ When I run `wp post url 1 {POST_ID}` Then STDOUT should be: """ https://example.com/?p=1 https://example.com/?p={POST_ID} """ When I run `wp post get 1 --field=url` Then STDOUT should be: """ https://example.com/?p=1 """ Scenario: Update a post from file or STDIN Given a content.html file: """ Oh glorious CLI """ And a content-2.html file: """ Let it be the weekend """ When I run `wp post create --post_title="Testing update via STDIN" --porcelain` Then STDOUT should be a number And save STDOUT as {POST_ID} When I run `cat content.html | wp post update {POST_ID} -` Then STDOUT should contain: """ Success: Updated post {POST_ID} """ When I run `wp post get --field=post_content {POST_ID}` Then STDOUT should be: """ Oh glorious CLI """ When I run `wp post create --post_title="Testing update via STDIN. Again!" --porcelain` Then STDOUT should be a number And save STDOUT as {POST_ID_TWO} When I run `wp post update {POST_ID} {POST_ID_TWO} content-2.html` Then STDOUT should contain: """ Success: Updated post {POST_ID_TWO} """ When I run `wp post get --field=post_content {POST_ID_TWO}` Then STDOUT should be: """ Let it be the weekend """ When I try `wp post update {POST_ID} invalid-file.html` Then STDERR should be: """ Error: Unable to read content from 'invalid-file.html'. """ And the return code should be 1 Scenario: Creating/listing posts When I run `wp post create --post_title='Publish post' --post_content='Publish post content' --post_status='publish' --porcelain` Then STDOUT should be a number And save STDOUT as {POST_ID} When I run `wp post create --post_title='Draft post' --post_content='Draft post content' --post_status='draft' --porcelain` Then STDOUT should be a number When I run `wp post list --post_type='post' --fields=post_title,post_name,post_status --format=csv` Then STDOUT should be CSV containing: | post_title | post_name | post_status | | Publish post | publish-post | publish | | Draft post | | draft | When I run `wp post list --post_type='post' --fields=title,name,status --format=csv` Then STDOUT should be CSV containing: | post_title | post_name | post_status | | Publish post | publish-post | publish | | Draft post | | draft | When I run `wp post list --post_type='post' --fields="title, name, status" --format=csv` Then STDOUT should be CSV containing: | post_title | post_name | post_status | | Publish post | publish-post | publish | | Draft post | | draft | When I run `wp post list --post__in={POST_ID} --format=count` Then STDOUT should be: """ 1 """ When I run `wp post list --post_type='page' --field=title` Then STDOUT should contain: """ Sample Page """ When I run `wp post list --post_type=any --fields=post_title,post_name,post_status --format=csv --orderby=post_title --order=ASC` Then STDOUT should be CSV containing: | post_title | post_name | post_status | | Draft post | | draft | | Hello world! | hello-world | publish | | Publish post | publish-post | publish | | Sample Page | sample-page | publish | Scenario: Update categories on a post When I run `wp term create category "Test Category" --porcelain` Then save STDOUT as {TERM_ID} When I run `wp post update 1 --post_category={TERM_ID}` And I run `wp post term list 1 category --format=json --fields=name` Then STDOUT should be: """ [{"name":"Test Category"}] """ Scenario: Make sure WordPress receives the slashed data it expects When I run `wp post create --post_title='My\Post' --porcelain` Then save STDOUT as {POST_ID} When I run `wp post get {POST_ID} --field=title` Then STDOUT should be: """ My\Post """ When I run `wp post update {POST_ID} --post_content='var isEmailValid = /^\S+@\S+.\S+$/.test(email);'` Then STDOUT should not be empty When I run `wp post get {POST_ID} --field=content` Then STDOUT should be: """ var isEmailValid = /^\S+@\S+.\S+$/.test(email); """ @require-wp-4.4 Scenario: Creating/updating posts with meta keys When I run `wp post create --post_title='Test Post' --post_content='Test post content' --meta_input='{"key1":"value1","key2":"value2"}' --porcelain` Then STDOUT should be a number And save STDOUT as {POST_ID} When I run `wp post meta list {POST_ID} --format=table` Then STDOUT should be a table containing rows: | post_id | meta_key | meta_value | | {POST_ID} | key1 | value1 | | {POST_ID} | key2 | value2 | When I run `wp post update {POST_ID} --meta_input='{"key2":"value2b","key3":"value3"}'` And I run `wp post meta list {POST_ID} --format=table` Then STDOUT should be a table containing rows: | post_id | meta_key | meta_value | | {POST_ID} | key1 | value1 | | {POST_ID} | key2 | value2b | | {POST_ID} | key3 | value3 | @less-than-wp-4.4 Scenario: Creating/updating posts with meta keys for WP < 4.4 has no effect so should give warning When I try `wp post create --post_title='Test Post' --post_content='Test post content' --meta_input='{"key1":"value1","key2":"value2"}' --porcelain` Then the return code should be 0 And STDOUT should be a number And save STDOUT as {POST_ID} And STDERR should be: """ Warning: The 'meta_input' field was only introduced in WordPress 4.4 so will have no effect. """ When I run `wp post meta list {POST_ID} --format=count` Then STDOUT should be: """ 0 """ When I try `wp post update {POST_ID} --meta_input='{"key2":"value2b","key3":"value3"}'` Then the return code should be 0 And STDERR should be: """ Warning: The 'meta_input' field was only introduced in WordPress 4.4 so will have no effect. """ And STDOUT should be: """ Success: Updated post {POST_ID}. """ When I run `wp post meta list {POST_ID} --format=count` Then STDOUT should be: """ 0 """ Scenario: Publishing a post and setting a date fails if the edit_date flag is not passed. Given a WP install When I run `wp post create --post_title='test' --porcelain` Then save STDOUT as {POST_ID} When I run `wp post update {POST_ID} --post_date='2005-01-24T09:52:00.000Z' --post_status='publish'` Then STDOUT should contain: """ Success: """ When I run `wp post get {POST_ID} --field=post_date` Then STDOUT should not contain: """ 2005-01-24 09:52:00 """ @require-mysql Scenario: Publishing a post and setting a date succeeds if the edit_date flag is passed. Given a WP install When I run `wp post create --post_title='test' --porcelain` Then save STDOUT as {POST_ID} When I run `wp post update {POST_ID} --post_date='2005-01-24T09:52:00.000Z' --post_status='publish' --edit_date=1` Then STDOUT should contain: """ Success: """ When I run `wp post get {POST_ID} --field=post_date` Then STDOUT should contain: """ 2005-01-24 09:52:00 """ # Separate test because of a known bug in the SQLite plugin. # See https://github.com/WordPress/sqlite-database-integration/issues/52. # Once the bug is resolved, this separate test can be removed again. @require-sqlite Scenario: Publishing a post and setting a date succeeds if the edit_date flag is passed. Given a WP install When I run `wp post create --post_title='test' --porcelain` Then save STDOUT as {POST_ID} When I run `wp post update {POST_ID} --post_date='2005-01-24T09:52:00.000Z' --post_status='publish' --edit_date=1` Then STDOUT should contain: """ Success: """ When I run `wp post get {POST_ID} --field=post_date` Then STDOUT should contain: """ 2005-01-24T09:52:00.000Z """