diff --git a/app/HashidsTicketCodeGenerator.php b/app/HashidsTicketCodeGenerator.php new file mode 100644 index 0000000..026b8ad --- /dev/null +++ b/app/HashidsTicketCodeGenerator.php @@ -0,0 +1,18 @@ +hashids = new \Hashids\Hashids($salt, 6, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'); + } + + public function generateFor($ticket) + { + return $this->hashids->encode($ticket->id); + } +} diff --git a/app/TicketCodeGenerator.php b/app/TicketCodeGenerator.php index 9c6fadd..50771aa 100644 --- a/app/TicketCodeGenerator.php +++ b/app/TicketCodeGenerator.php @@ -4,5 +4,5 @@ namespace App; interface TicketCodeGenerator { - public function generate(); + public function generateFor($ticket); } diff --git a/tests/unit/HashidsTicketCodeGeneratorTest.php b/tests/unit/HashidsTicketCodeGeneratorTest.php new file mode 100644 index 0000000..12f0bc2 --- /dev/null +++ b/tests/unit/HashidsTicketCodeGeneratorTest.php @@ -0,0 +1,64 @@ +generateFor(new Ticket(['id' => 1])); + + $this->assertTrue(strlen($code) >= 6); + } + + /** @test */ + function ticket_codes_can_only_contain_uppercase_letters() + { + $ticketCodeGenerator = new HashidsTicketCodeGenerator('testsalt1'); + + $code = $ticketCodeGenerator->generateFor(new Ticket(['id' => 1])); + + $this->assertRegExp('/^[A-Z]+$/', $code); + } + + /** @test */ + function ticket_codes_for_the_same_ticket_id_are_the_same() + { + $ticketCodeGenerator = new HashidsTicketCodeGenerator('testsalt1'); + + $code1 = $ticketCodeGenerator->generateFor(new Ticket(['id' => 1])); + $code2 = $ticketCodeGenerator->generateFor(new Ticket(['id' => 1])); + + $this->assertEquals($code1, $code2); + } + + /** @test */ + function ticket_codes_for_different_ticket_ids_are_different() + { + $ticketCodeGenerator = new HashidsTicketCodeGenerator('testsalt1'); + + $code1 = $ticketCodeGenerator->generateFor(new Ticket(['id' => 1])); + $code2 = $ticketCodeGenerator->generateFor(new Ticket(['id' => 2])); + + $this->assertNotEquals($code1, $code2); + } + + /** @test */ + function ticket_codes_generated_with_different_salts_are_different() + { + $ticketCodeGenerator1 = new HashidsTicketCodeGenerator('testsalt1'); + $ticketCodeGenerator2 = new HashidsTicketCodeGenerator('testsalt2'); + + $code1 = $ticketCodeGenerator1->generateFor(new Ticket(['id' => 1])); + $code2 = $ticketCodeGenerator2->generateFor(new Ticket(['id' => 1])); + + $this->assertNotEquals($code1, $code2); + } +}