repository = Mockery::mock(ContentRepository::class); $this->slugGenerator = new SlugGenerator($this->repository); }); it('generates slug from title', function () { $slug = $this->slugGenerator->generateFromTitle('My Awesome Page'); expect($slug)->toBeInstanceOf(ContentSlug::class); expect($slug->toString())->toBe('my-awesome-page'); }); it('handles special characters in title', function () { $slug = $this->slugGenerator->generateFromTitle('Hello & World!'); expect($slug->toString())->toBe('hello-world'); }); it('handles empty title', function () { $slug = $this->slugGenerator->generateFromTitle(''); expect($slug->toString())->toStartWith('content-'); }); it('truncates long titles', function () { $longTitle = str_repeat('a', 300); $slug = $this->slugGenerator->generateFromTitle($longTitle); expect(strlen($slug->toString()))->toBeLessThanOrEqual(255); }); it('generates unique slug when base slug exists', function () { $this->repository->shouldReceive('existsSlug') ->once() ->with(Mockery::on(fn ($slug) => $slug->toString() === 'my-page')) ->andReturn(true); $this->repository->shouldReceive('existsSlug') ->once() ->with(Mockery::on(fn ($slug) => $slug->toString() === 'my-page-1')) ->andReturn(false); $slug = $this->slugGenerator->generateUniqueFromTitle('My Page'); expect($slug->toString())->toBe('my-page-1'); }); it('generates unique slug with multiple collisions', function () { $this->repository->shouldReceive('existsSlug') ->once() ->with(Mockery::on(fn ($slug) => $slug->toString() === 'my-page')) ->andReturn(true); $this->repository->shouldReceive('existsSlug') ->once() ->with(Mockery::on(fn ($slug) => $slug->toString() === 'my-page-1')) ->andReturn(true); $this->repository->shouldReceive('existsSlug') ->once() ->with(Mockery::on(fn ($slug) => $slug->toString() === 'my-page-2')) ->andReturn(false); $slug = $this->slugGenerator->generateUniqueFromTitle('My Page'); expect($slug->toString())->toBe('my-page-2'); }); it('returns base slug when it does not exist', function () { $this->repository->shouldReceive('existsSlug') ->once() ->with(Mockery::on(fn ($slug) => $slug->toString() === 'my-page')) ->andReturn(false); $slug = $this->slugGenerator->generateUniqueFromTitle('My Page'); expect($slug->toString())->toBe('my-page'); }); });