diff --git a/lib/SimpleSAML/Module.php b/lib/SimpleSAML/Module.php
index ef622231928f0f06fd34f642633748108f529175..425eb13b9a659465b44cd2ac9d44e68dc4b0cf63 100644
--- a/lib/SimpleSAML/Module.php
+++ b/lib/SimpleSAML/Module.php
@@ -496,7 +496,7 @@ class Module
                 continue;
             }
 
-            if (!preg_match('/hook_(\w+)\.php/', $file, $matches)) {
+            if (!preg_match('/^hook_(\w+)\.php$/', $file, $matches)) {
                 continue;
             }
             $hook_name = $matches[1];
diff --git a/tests/lib/SimpleSAML/ModuleTest.php b/tests/lib/SimpleSAML/ModuleTest.php
index 0a4b69941e628d1bacc03d13662ed6915c442dc6..543e3070905468c636a33380fbf9aa201ad51a21 100644
--- a/tests/lib/SimpleSAML/ModuleTest.php
+++ b/tests/lib/SimpleSAML/ModuleTest.php
@@ -112,4 +112,26 @@ class ModuleTest extends TestCase
             '\SimpleSAML\Auth\ProcessingFilter'
         ));
     }
+
+    /**
+     * Test for SimpleSAML\Module::getModuleHooks(). It covers happy path.
+     */
+    public function testGetModuleHooks(): void
+    {
+        $hooks = Module::getModuleHooks('saml');
+        $this->assertArrayHasKey('metadata_hosted', $hooks);
+        $this->assertEquals('saml_hook_metadata_hosted', $hooks['metadata_hosted']['func']);
+        $expectedFile = dirname(__DIR__, 3) . '/modules/saml/hooks/hook_metadata_hosted.php';
+        $this->assertEquals($expectedFile, $hooks['metadata_hosted']['file']);
+    }
+
+    /**
+     * Test for SimpleSAML\Module::getModuleHooks(). It covers invalid hook names
+     */
+    public function testGetModuleHooksIgnoresInvalidHooks(): void
+    {
+        $hooks = Module::getModuleHooks('../tests/modules/unittest');
+        $this->assertArrayHasKey('valid', $hooks, 'hooks=' . var_export($hooks, true));
+        $this->assertCount(1, $hooks, "Invalid hooks should be ignored");
+    }
 }
diff --git a/tests/modules/unittest/README.md b/tests/modules/unittest/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..52b5ff5a2fcf33a12173a6da26846b8a2d139f4c
--- /dev/null
+++ b/tests/modules/unittest/README.md
@@ -0,0 +1 @@
+For some unit tests we need a module that has a specific setup or issues.
diff --git a/tests/modules/unittest/hooks/hook_invalid.php.orig b/tests/modules/unittest/hooks/hook_invalid.php.orig
new file mode 100644
index 0000000000000000000000000000000000000000..d09ba0cd5deaff7120e1f23bc52abac2ae8927c2
--- /dev/null
+++ b/tests/modules/unittest/hooks/hook_invalid.php.orig
@@ -0,0 +1,3 @@
+<?php
+
+// Hook detection should not load this file since it does not conform to the hook naming scheme
diff --git a/tests/modules/unittest/hooks/hook_valid.php b/tests/modules/unittest/hooks/hook_valid.php
new file mode 100644
index 0000000000000000000000000000000000000000..b45dcd25ea7611ac8506ab175f76157e0a603172
--- /dev/null
+++ b/tests/modules/unittest/hooks/hook_valid.php
@@ -0,0 +1,14 @@
+<?php
+
+use SimpleSAML\Assert\Assert;
+use SimpleSAML\Auth;
+
+/**
+ * Hook to for use with unit tests
+ *
+ * @param array &$data  Some data
+ */
+function unittest_hook_valid(array &$data)
+{
+    $data['summary'][] = 'success';
+}
diff --git a/tests/modules/unittest/hooks/invalid_hook_prefix.php b/tests/modules/unittest/hooks/invalid_hook_prefix.php
new file mode 100644
index 0000000000000000000000000000000000000000..d09ba0cd5deaff7120e1f23bc52abac2ae8927c2
--- /dev/null
+++ b/tests/modules/unittest/hooks/invalid_hook_prefix.php
@@ -0,0 +1,3 @@
+<?php
+
+// Hook detection should not load this file since it does not conform to the hook naming scheme