From b4b1ecd6d3d4dfbbf961c6e5379f42d325c84a18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20Beganovi=C4=87?= Date: Wed, 28 Feb 2024 17:55:55 +0100 Subject: [PATCH] Add DependencyTest.php for unit testing --- tests/Unit/BillingPortal/DependencyTest.php | 125 ++++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 tests/Unit/BillingPortal/DependencyTest.php diff --git a/tests/Unit/BillingPortal/DependencyTest.php b/tests/Unit/BillingPortal/DependencyTest.php new file mode 100644 index 000000000000..2cdad70fd21a --- /dev/null +++ b/tests/Unit/BillingPortal/DependencyTest.php @@ -0,0 +1,125 @@ +checkDependencies([ + RFF::class, + RegisterOrLogin::class, + Cart::class, + ]); + + $this->assertCount(1, $results); + + $results = $this->checkDependencies([ + RegisterOrLogin::class, + Cart::class, + RFF::class, + ]); + + $this->assertCount(0, $results); + + $results = $this->checkDependencies([ + RegisterOrLogin::class, + RFF::class, + Cart::class, + ]); + + $this->assertCount(0, $results); + } + + public function testSorting() + { + $results = $this->sort([ + RFF::class, + RegisterOrLogin::class, + Cart::class, + ]); + + $this->assertEquals(Purchase::$steps, $results); + + $results = $this->sort([ + RegisterOrLogin::class, + Cart::class, + RFF::class, + ]); + + $this->assertEquals([ + Setup::class, + RegisterOrLogin::class, + Cart::class, + RFF::class, + Submit::class, + ], $results); + + $results = $this->sort([ + RegisterOrLogin::class, + RFF::class, + Cart::class, + ]); + + $this->assertEquals([ + Setup::class, + RegisterOrLogin::class, + RFF::class, + Cart::class, + Submit::class, + ], $results); + } + + private function checkDependencies(array $steps): array + { + $dependencies = Purchase::$dependencies; + $stepOrder = array_flip($steps); + $errors = []; + + foreach ($steps as $step) { + $dependentClasses = $dependencies[$step] ?? []; + + foreach ($dependentClasses as $dependency) { + if (in_array($dependency, $steps) && $stepOrder[$dependency] > $stepOrder[$step]) { + $errors[] = "Dependency error: $step depends on $dependency"; + } + } + } + + return $errors; + } + + private function sort(array $dependencies): array + { + $errors = $this->checkDependencies($dependencies); + + if (count($errors)) { + return Purchase::$steps; + } + + return [Setup::class, ...$dependencies, Submit::class]; + } +}