diff --git a/README.md b/README.md index f13bd4b..9fef7f8 100644 --- a/README.md +++ b/README.md @@ -15,8 +15,8 @@ This module will be used to demonstrate how to take a test-driven approach to develop a module to the following acceptance criteria: - As a site visitor -- I want to see a list of all published pages at `/pages` -- Ordered alphabetically by title +- I want to see a list of all published blog posts at `/blog` +- Ordered by post date, with the newest posts first ## Installation @@ -24,7 +24,7 @@ Within your Drupal 8 site: ```bash cd modules -git clone git@github.com:opdavies/drupal-module-tdd-dublin.git tdd_dublin +git clone git@github.com:opdavies/drupal-module-tdd-blog.git tdd_blog ``` ## Running the Tests @@ -37,19 +37,19 @@ Because of autoloading, you will either need to be inside Drupal's `core` subdir , or add `-c core` to the PHPUnit command when running the tests for them to execute successfully. This also assumes that the module is within a `modules/custom` directory and -named `tdd_dublin` as per the repository name. +named `tdd_blog` as per the repository name. ``` -vendor/bin/phpunit -c core modules/custom/tdd_dublin +vendor/bin/phpunit -c core modules/custom/tdd_blog ``` You can use PHPUnit's `--filter` option to specify a single test method to run, rather than all of the tests within the module. For example: ``` -vendor/bin/phpunit -c core modules/custom/tdd_dublin --filter=testOnlyPublishedPagesAreShown +vendor/bin/phpunit -c core modules/custom/tdd_blog --filter=testOnlyPublishedPagesAreShown ``` -[0]: https://www.oliverdavi.es/talks/tdd-test-driven-drupal -[1]: https://github.com/opdavies/tdd_dublin/commits/HEAD -[2]: https://github.com/opdavies/tdd_dublin/tags +[0]: https://www.oliverdavies.uk/talks/tdd-test-driven-drupal +[1]: https://github.com/opdavies/drupal-module-tdd-blog/commits/HEAD +[2]: https://github.com/opdavies/drupal-module-tdd-blog/tags diff --git a/composer.json b/composer.json index e57be22..aa7e974 100644 --- a/composer.json +++ b/composer.json @@ -1,4 +1,4 @@ { - "name": "drupal/tdd_dublin", + "name": "drupal/tdd_blog", "type": "drupal-custom-module" } diff --git a/config/install/node.type.article.yml b/config/install/node.type.article.yml new file mode 100644 index 0000000..57dcc0c --- /dev/null +++ b/config/install/node.type.article.yml @@ -0,0 +1,10 @@ +langcode: en +status: true +dependencies: { } +name: 'Basic page' +type: page +description: 'Use basic pages for your static content, such as an ''About us'' page.' +help: '' +new_revision: true +preview_mode: 1 +display_submitted: false diff --git a/config/install/views.view.pages.yml b/config/install/views.view.blog.yml similarity index 89% rename from config/install/views.view.pages.yml rename to config/install/views.view.blog.yml index 9834a6b..783846f 100644 --- a/config/install/views.view.pages.yml +++ b/config/install/views.view.blog.yml @@ -2,12 +2,12 @@ langcode: en status: true dependencies: config: - - node.type.page + - node.type.article module: - - node - - user -id: pages -label: pages + - node + - user +id: blog +label: Blog module: views description: '' tag: '' @@ -147,7 +147,7 @@ display: admin_label: '' operator: in value: - page: page + article: article group: 1 exposed: false expose: @@ -179,10 +179,10 @@ display: entity_field: type plugin_id: bundle sorts: - title: - id: title + created: + id: created table: node_field_data - field: title + field: created relationship: none group_type: group admin_label: '' @@ -190,9 +190,10 @@ display: exposed: false expose: label: '' + granularity: second entity_type: node - entity_field: title - plugin_id: standard + entity_field: created + plugin_id: date header: { } footer: { } empty: { } @@ -202,11 +203,11 @@ display: cache_metadata: max-age: -1 contexts: - - 'languages:language_content' - - 'languages:language_interface' - - url.query_args - - 'user.node_grants:view' - - user.permissions + - 'languages:language_content' + - 'languages:language_interface' + - url.query_args + - 'user.node_grants:view' + - user.permissions tags: { } page_1: display_plugin: page @@ -215,13 +216,13 @@ display: position: 1 display_options: display_extenders: { } - path: pages + path: blog cache_metadata: max-age: -1 contexts: - - 'languages:language_content' - - 'languages:language_interface' - - url.query_args - - 'user.node_grants:view' - - user.permissions + - 'languages:language_content' + - 'languages:language_interface' + - url.query_args + - 'user.node_grants:view' + - user.permissions tags: { } diff --git a/tdd_dublin.info.yml b/tdd_blog.info.yml similarity index 89% rename from tdd_dublin.info.yml rename to tdd_blog.info.yml index 448351b..f9453b1 100644 --- a/tdd_dublin.info.yml +++ b/tdd_blog.info.yml @@ -1,4 +1,4 @@ -name: 'TDD Dublin' +name: 'TDD Blog' description: 'A demo module for DrupalCamp Dublin to show test driven module development.' core: 8.x type: module diff --git a/tests/src/Functional/PageListTest.php b/tests/src/Functional/PageListTest.php new file mode 100644 index 0000000..9b74a9f --- /dev/null +++ b/tests/src/Functional/PageListTest.php @@ -0,0 +1,17 @@ +drupalGet('blog'); + + $this->assertSession()->statusCodeEquals(200); + } + +} diff --git a/tests/src/Kernel/PageListTest.php b/tests/src/Kernel/PageListTest.php index 6d8df53..2e5cb48 100644 --- a/tests/src/Kernel/PageListTest.php +++ b/tests/src/Kernel/PageListTest.php @@ -1,14 +1,14 @@ installEntitySchema('node'); $this->installEntitySchema('user'); - $this->installConfig(['filter', 'tdd_dublin']); + $this->installConfig(['filter', 'tdd_blog']); } /** @@ -41,58 +41,59 @@ class PageListTest extends EntityKernelTestBase { * Ensure that only published pages are returned by the view. Unpublished * pages or content of different types should not be shown. */ - public function testOnlyPublishedPagesAreShown() { - // This is a published page, so it should be visible. + public function testOnlyPublishedArticlesAreShown() { + // This is a published article, so it should be visible. $this->createNode(['type' => 'page', 'status' => TRUE]); - // This is an article, so it should not be visible. + // This is a page, so it should not be visible. $this->createNode(['type' => 'article']); - // This page is not published, so it should not be visible. - $this->createNode(['type' => 'page', 'status' => FALSE]); + // This article is not published, so it should not be visible. + $this->createNode(['type' => 'article', 'status' => FALSE]); // Rather than testing the rendered HTML, we are going to load the view // results programmatically and run assertions against the data it returns. // This makes it easier to test certain scenarios, and ensures that the // test is future-proofed and won't fail at a later date due to a change in // the presentation code. - $nids = array_map(function (ResultRow $result) { - return $result->_entity->id(); - }, views_get_view_result('pages')); + $nids = $this->getViewResults(); // Only node 1 matches the criteria of being a published page, so only that // node ID should be being returned from the view. assertEquals() can be // used to compare the expected result to what is being returned. - $this->assertEquals([1], $nids); + $this->assertEquals([2], $nids); } /** * Ensure that the results are ordered by title. */ - public function testResultsAreOrderedAlphabetically() { - // Create a number of nodes with different titles, specifying the title for - // each. These are intentionally not in alphabetical order so that when the - // assertion is written for the results to be in the expected order, it - // will fail, rather than them being in the expected order based on the - // default sort criteria based on the created timestamp. - // - // Also, the titles are added explicitly so that the assertion can be - // written against the expected order based on these titles. If they - // weren't added, each title would be automatically generated so the - // expected order would not be known beforehand. - $this->createNode(['title' => 'Page A']); - $this->createNode(['title' => 'Page D']); - $this->createNode(['title' => 'Page C']); - $this->createNode(['title' => 'Page B']); + public function testArticlesAreOrderedByDate() { + $this->createNode(['type' => 'article', 'created' => (new DrupalDateTime('+1 day'))->getTimestamp()]); + $this->createNode(['type' => 'article', 'created' => (new DrupalDateTime('+1 month'))->getTimestamp()]); + $this->createNode(['type' => 'article', 'created' => (new DrupalDateTime('+3 days'))->getTimestamp()]); + $this->createNode(['type' => 'article', 'created' => (new DrupalDateTime('+1 hour'))->getTimestamp()]); // Get the result data from the view. - $nids = array_map(function (ResultRow $result) { - return $result->_entity->id(); - }, views_get_view_result('pages')); + $nids = $this->getViewResults(); // Compare the expected order based on the titles defined above to the // ordered results from the view. - $this->assertEquals([1, 4, 3, 2], $nids); + $this->assertEquals([4, 1, 3, 2], $nids); + } + + /** + * Load the view and get the results. + * + * @param string $view + * (optional) The name of the view. Defaults to 'blog'. + * + * @return array + * An array of returned entity IDs. + */ + private function getViewResults($view = 'blog') { + return array_map(function (ResultRow $result) { + return $result->_entity->id(); + }, views_get_view_result($view)); } }