From 67a9f556c4217b43383513b500d4ec50ef4cb16f Mon Sep 17 00:00:00 2001
From: Oliver Davies <oliver@oliverdavies.uk>
Date: Fri, 21 Apr 2023 12:01:22 +0100
Subject: [PATCH] feat: add an example module with custom tests

Add a custom module based on my Drupal module template:

https://github.com/opdavies/drupal-module-template
---
 web/modules/custom/example/.gitignore         |  2 ++
 web/modules/custom/example/composer.json      |  5 +++
 web/modules/custom/example/example.info.yml   |  5 +++
 .../custom/example/example.routing.yml        |  7 +++++
 .../custom/example/example.services.yml       |  7 +++++
 web/modules/custom/example/phpcs.xml.dist     | 31 +++++++++++++++++++
 .../src/Controller/ExamplePageController.php  | 29 +++++++++++++++++
 .../tests/src/Functional/ExamplePageTest.php  | 31 +++++++++++++++++++
 .../custom/example/tests/src/Kernel/.keep     |  0
 .../custom/example/tests/src/Unit/.keep       |  0
 10 files changed, 117 insertions(+)
 create mode 100644 web/modules/custom/example/.gitignore
 create mode 100644 web/modules/custom/example/composer.json
 create mode 100644 web/modules/custom/example/example.info.yml
 create mode 100644 web/modules/custom/example/example.routing.yml
 create mode 100644 web/modules/custom/example/example.services.yml
 create mode 100644 web/modules/custom/example/phpcs.xml.dist
 create mode 100644 web/modules/custom/example/src/Controller/ExamplePageController.php
 create mode 100644 web/modules/custom/example/tests/src/Functional/ExamplePageTest.php
 create mode 100644 web/modules/custom/example/tests/src/Kernel/.keep
 create mode 100644 web/modules/custom/example/tests/src/Unit/.keep

diff --git a/web/modules/custom/example/.gitignore b/web/modules/custom/example/.gitignore
new file mode 100644
index 0000000..c8153b5
--- /dev/null
+++ b/web/modules/custom/example/.gitignore
@@ -0,0 +1,2 @@
+/composer.lock
+/vendor/
diff --git a/web/modules/custom/example/composer.json b/web/modules/custom/example/composer.json
new file mode 100644
index 0000000..1036ea1
--- /dev/null
+++ b/web/modules/custom/example/composer.json
@@ -0,0 +1,5 @@
+{
+  "require": {
+    "symfony/config": "^6.1"
+  }
+}
diff --git a/web/modules/custom/example/example.info.yml b/web/modules/custom/example/example.info.yml
new file mode 100644
index 0000000..888947d
--- /dev/null
+++ b/web/modules/custom/example/example.info.yml
@@ -0,0 +1,5 @@
+name: Example module
+description: TODO
+type: module
+core_version_requirement: ^9||^10
+package: Example
diff --git a/web/modules/custom/example/example.routing.yml b/web/modules/custom/example/example.routing.yml
new file mode 100644
index 0000000..9504c9b
--- /dev/null
+++ b/web/modules/custom/example/example.routing.yml
@@ -0,0 +1,7 @@
+drupal-module-template.example:
+  path: /@opdavies/drupal-module-template
+  defaults:
+    _controller: Drupal\example\Controller\ExamplePageController
+    _title: Example page
+  requirements:
+    _permission: access content
diff --git a/web/modules/custom/example/example.services.yml b/web/modules/custom/example/example.services.yml
new file mode 100644
index 0000000..3db3f80
--- /dev/null
+++ b/web/modules/custom/example/example.services.yml
@@ -0,0 +1,7 @@
+services:
+  Drupal\Core\Logger\LoggerChannelFactoryInterface:
+    alias: logger.factory
+    private: true
+
+  Drupal\example\Controller\ExamplePageController:
+    autowire: true
diff --git a/web/modules/custom/example/phpcs.xml.dist b/web/modules/custom/example/phpcs.xml.dist
new file mode 100644
index 0000000..eed65a9
--- /dev/null
+++ b/web/modules/custom/example/phpcs.xml.dist
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ruleset name="phpcs-standard">
+  <description>Codestyle ruleset for Drupal</description>
+
+  <rule ref="Drupal"/>
+  <rule ref="DrupalPractice"/>
+
+  <arg name="ignore" value="*.css,*.md,*.txt"/>
+
+  <arg name="colors"/>
+  <arg value="np"/>
+
+  <file>./src</file>
+
+  <rule ref="Drupal">
+    <exclude name="Drupal.Commenting.ClassComment.Missing"/>
+    <exclude name="Drupal.NamingConventions.ValidFunctionName.ScopeNotCamelCaps"/>
+    <exclude name="Drupal.Commenting.DataTypeNamespace.DataTypeNamespace"/>
+    <exclude name="Drupal.Commenting.DocComment.MissingShort"/>
+    <exclude name="Drupal.Commenting.FunctionComment.IncorrectParamVarName"/>
+    <exclude name="Drupal.Commenting.FunctionComment.IncorrectTypeHint"/>
+    <exclude name="Drupal.Commenting.FunctionComment.InvalidReturn"/>
+    <exclude name="Drupal.Commenting.FunctionComment.Missing"/>
+    <exclude name="Drupal.Commenting.FunctionComment.MissingParamComment"/>
+    <exclude name="Drupal.Commenting.FunctionComment.MissingReturnComment"/>
+    <exclude name="Drupal.Commenting.FunctionComment.ParamTypeSpaces"/>
+    <exclude name="Drupal.Commenting.InlineComment.DocBlock"/>
+    <exclude name="Drupal.Commenting.VariableComment.Missing"/>
+    <exclude name="DrupalPractice.Objects.StrictSchemaDisabled.StrictConfigSchema"/>
+  </rule>
+</ruleset>
diff --git a/web/modules/custom/example/src/Controller/ExamplePageController.php b/web/modules/custom/example/src/Controller/ExamplePageController.php
new file mode 100644
index 0000000..859f49b
--- /dev/null
+++ b/web/modules/custom/example/src/Controller/ExamplePageController.php
@@ -0,0 +1,29 @@
+<?php
+
+declare(strict_types=1);
+
+namespace Drupal\example\Controller;
+
+use Drupal\Core\Logger\LoggerChannelFactoryInterface;
+use Drupal\Core\StringTranslation\StringTranslationTrait;
+
+final class ExamplePageController {
+
+  use StringTranslationTrait;
+
+  public function __construct(
+    private LoggerChannelFactoryInterface $logger
+  ) {}
+
+  public function __invoke(): array {
+    $this->logger->get('example')->info('Example page viewed.');
+
+    return [
+      '#markup' => $this->t(
+        'This is an example page from the <a href="@url">Drupal Module Template</a>.',
+        ['@url' => 'https://github.com/opdavies/drupal-module-template']
+      ),
+    ];
+  }
+
+}
diff --git a/web/modules/custom/example/tests/src/Functional/ExamplePageTest.php b/web/modules/custom/example/tests/src/Functional/ExamplePageTest.php
new file mode 100644
index 0000000..5ecb1b8
--- /dev/null
+++ b/web/modules/custom/example/tests/src/Functional/ExamplePageTest.php
@@ -0,0 +1,31 @@
+<?php
+
+namespace Drupal\Tests\example\Functional;
+
+use Drupal\Tests\BrowserTestBase;
+use Symfony\Component\HttpFoundation\Response;
+
+final class ExamplePageTest extends BrowserTestBase {
+
+  public $defaultTheme = 'stark';
+
+  protected static $modules = [
+    // Core.
+    'node',
+
+    // Custom.
+    "example"
+  ];
+
+  /** @test */
+  public function should_load_the_example_page_for_anonymous_users(): void {
+    // Arrange.
+
+    // Act.
+    $this->drupalGet('/@opdavies/drupal-module-template');
+
+    // Assert.
+    $this->assertSession()->statusCodeEquals(Response::HTTP_OK);
+  }
+
+}
diff --git a/web/modules/custom/example/tests/src/Kernel/.keep b/web/modules/custom/example/tests/src/Kernel/.keep
new file mode 100644
index 0000000..e69de29
diff --git a/web/modules/custom/example/tests/src/Unit/.keep b/web/modules/custom/example/tests/src/Unit/.keep
new file mode 100644
index 0000000..e69de29