createMock(InvoiceRepository::class); $repository ->expects($this->any()) ->method('hasInvoice') ->willReturnCallback(function ($number) use ($hasInitialInvoice, $followingInvoices) { if (stripos($number, '-') === false) { return $hasInitialInvoice; } return $followingInvoices; }); return new DateNumberGenerator($repository); } public function testGetInvoiceNumber() { $sut = $this->getSut(false, false); $sut->setModel((new InvoiceModelFactoryFactory($this))->create()->createModel(new DebugFormatter(), new Customer('foo'), new InvoiceTemplate(), new InvoiceQuery())); $this->assertEquals(date('ymd'), $sut->getInvoiceNumber()); $this->assertEquals('date', $sut->getId()); } public function testGetInvoiceNumberWithExisting() { $sut = $this->getSut(true, false); $sut->setModel((new InvoiceModelFactoryFactory($this))->create()->createModel(new DebugFormatter(), new Customer('foo'), new InvoiceTemplate(), new InvoiceQuery())); $this->assertEquals(date('ymd-01'), $sut->getInvoiceNumber()); $this->assertEquals('date', $sut->getId()); } public function testGetInvoiceNumberWithManyExisting() { $sut = $this->getSut(true, true); $sut->setModel((new InvoiceModelFactoryFactory($this))->create()->createModel(new DebugFormatter(), new Customer('foo'), new InvoiceTemplate(), new InvoiceQuery())); $this->assertEquals(date('ymd-99'), $sut->getInvoiceNumber()); $this->assertEquals('date', $sut->getId()); } }