em = $this->prophesize(EntityManagerInterface::class); $this->em->persist(Argument::any())->willReturn(null); $this->em->flush()->willReturn(null); $this->service = new ShortUrlService($this->em->reveal()); } /** @test */ public function listedUrlsAreReturnedFromEntityManager(): void { $list = [ new ShortUrl(''), new ShortUrl(''), new ShortUrl(''), new ShortUrl(''), ]; $repo = $this->prophesize(ShortUrlRepository::class); $repo->findList(Argument::cetera())->willReturn($list)->shouldBeCalledOnce(); $repo->countList(Argument::cetera())->willReturn(count($list))->shouldBeCalledOnce(); $this->em->getRepository(ShortUrl::class)->willReturn($repo->reveal()); $list = $this->service->listShortUrls(ShortUrlsParams::emptyInstance()); $this->assertEquals(4, $list->getCurrentItemCount()); } /** @test */ public function exceptionIsThrownWhenSettingTagsOnInvalidShortcode(): void { $shortCode = 'abc123'; $repo = $this->prophesize(ShortUrlRepository::class); $repo->findOneByShortCode($shortCode, null)->willReturn(null) ->shouldBeCalledOnce(); $this->em->getRepository(ShortUrl::class)->willReturn($repo->reveal()); $this->expectException(ShortUrlNotFoundException::class); $this->service->setTagsByShortCode($shortCode); } /** @test */ public function providedTagsAreGetFromRepoAndSetToTheShortUrl(): void { $shortUrl = $this->prophesize(ShortUrl::class); $shortUrl->setTags(Argument::any())->shouldBeCalledOnce(); $shortCode = 'abc123'; $repo = $this->prophesize(ShortUrlRepository::class); $repo->findOneByShortCode($shortCode, null)->willReturn($shortUrl->reveal()) ->shouldBeCalledOnce(); $this->em->getRepository(ShortUrl::class)->willReturn($repo->reveal()); $tagRepo = $this->prophesize(EntityRepository::class); $tagRepo->findOneBy(['name' => 'foo'])->willReturn(new Tag('foo'))->shouldBeCalledOnce(); $tagRepo->findOneBy(['name' => 'bar'])->willReturn(null)->shouldBeCalledOnce(); $this->em->getRepository(Tag::class)->willReturn($tagRepo->reveal()); $this->service->setTagsByShortCode($shortCode, ['foo', 'bar']); } /** @test */ public function updateMetadataByShortCodeUpdatesProvidedData(): void { $shortUrl = new ShortUrl(''); $repo = $this->prophesize(ShortUrlRepository::class); $findShortUrl = $repo->findOneByShortCode('abc123', null)->willReturn($shortUrl); $getRepo = $this->em->getRepository(ShortUrl::class)->willReturn($repo->reveal()); $flush = $this->em->flush()->willReturn(null); $result = $this->service->updateMetadataByShortCode('abc123', ShortUrlMeta::fromRawData([ 'validSince' => Chronos::parse('2017-01-01 00:00:00')->toAtomString(), 'validUntil' => Chronos::parse('2017-01-05 00:00:00')->toAtomString(), 'maxVisits' => 5, ])); $this->assertSame($shortUrl, $result); $this->assertEquals(Chronos::parse('2017-01-01 00:00:00'), $shortUrl->getValidSince()); $this->assertEquals(Chronos::parse('2017-01-05 00:00:00'), $shortUrl->getValidUntil()); $this->assertEquals(5, $shortUrl->getMaxVisits()); $findShortUrl->shouldHaveBeenCalled(); $getRepo->shouldHaveBeenCalled(); $flush->shouldHaveBeenCalled(); } }