diff --git a/src/store/tests/Document/TextDocumentTest.php b/src/store/tests/Document/TextDocumentTest.php new file mode 100644 index 000000000..2c93dc93f --- /dev/null +++ b/src/store/tests/Document/TextDocumentTest.php @@ -0,0 +1,250 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\AI\Store\Tests\Document; + +use PHPUnit\Framework\Attributes\CoversClass; +use PHPUnit\Framework\Attributes\DataProvider; +use PHPUnit\Framework\Attributes\TestDox; +use PHPUnit\Framework\Attributes\TestWith; +use PHPUnit\Framework\TestCase; +use Symfony\AI\Store\Document\Metadata; +use Symfony\AI\Store\Document\TextDocument; +use Symfony\AI\Store\Exception\InvalidArgumentException; +use Symfony\Component\Uid\Uuid; + +#[CoversClass(TextDocument::class)] +final class TextDocumentTest extends TestCase +{ + #[TestDox('Creates document with valid content and metadata')] + public function testConstructorWithValidContent() + { + $id = Uuid::v4(); + $content = 'This is valid content'; + $metadata = new Metadata(['title' => 'Test Document']); + + $document = new TextDocument($id, $content, $metadata); + + $this->assertSame($id, $document->id); + $this->assertSame($content, $document->content); + $this->assertSame($metadata, $document->metadata); + } + + #[TestDox('Creates document with default empty metadata when not provided')] + public function testConstructorWithDefaultMetadata() + { + $id = Uuid::v4(); + $content = 'This is valid content'; + + $document = new TextDocument($id, $content); + + $this->assertSame($id, $document->id); + $this->assertSame($content, $document->content); + $this->assertInstanceOf(Metadata::class, $document->metadata); + $this->assertCount(0, $document->metadata); + } + + #[TestWith([''])] + #[TestWith([' '])] + #[TestWith([' '])] + #[TestWith(["\t\t\t"])] + #[TestWith(["\n\n\n"])] + #[TestWith([" \t \n \r "])] + #[TestWith(["\r\r\r"])] + #[TestDox('Throws exception for invalid content: $content')] + public function testConstructorThrowsExceptionForInvalidContent(string $content) + { + $this->expectException(InvalidArgumentException::class); + $this->expectExceptionMessage('The content shall not be an empty string.'); + + new TextDocument(Uuid::v4(), $content); + } + + #[TestWith(['Hello, World!'])] + #[TestWith([' Leading whitespace'])] + #[TestWith(['Trailing whitespace '])] + #[TestWith(["Line 1\nLine 2\nLine 3"])] + #[TestWith([" Text with\t\ttabs and\n\nnewlines "])] + #[TestWith(['a'])] + #[TestWith(['123456789'])] + #[TestWith(['!@#$%^&*()_+-=[]{}|;:,.<>?'])] + #[TestWith(['Hello δΈη π'])] + #[TestWith(['{"key": "value", "number": 42}'])] + #[TestWith(['
Hello World
'])] + #[TestWith(['# Heading\n\nThis is **bold** and this is *italic*.'])] + #[TestDox('Accepts valid content')] + public function testConstructorAcceptsValidContent(string $content) + { + $id = Uuid::v4(); + + $document = new TextDocument($id, $content); + + $this->assertSame($id, $document->id); + $this->assertSame($content, $document->content); + } + + #[TestDox('Accepts very long text content')] + public function testConstructorAcceptsVeryLongContent() + { + $id = Uuid::v4(); + $content = str_repeat('Lorem ipsum dolor sit amet, ', 1000); + + $document = new TextDocument($id, $content); + + $this->assertSame($id, $document->id); + $this->assertSame($content, $document->content); + } + + #[TestDox('Properties are publicly accessible and readonly')] + public function testReadonlyProperties() + { + $id = Uuid::v4(); + $content = 'Test content'; + $metadata = new Metadata(['key' => 'value']); + + $document = new TextDocument($id, $content, $metadata); + + // Test that properties are publicly accessible + $this->assertSame($id, $document->id); + $this->assertSame($content, $document->content); + $this->assertSame($metadata, $document->metadata); + } + + #[TestDox('Metadata contents can be modified even though the property is readonly')] + public function testMetadataCanBeModified() + { + $id = Uuid::v4(); + $content = 'Test content'; + $metadata = new Metadata(); + + $document = new TextDocument($id, $content, $metadata); + + // Metadata is readonly but its contents can be modified (ArrayObject behavior) + $metadata['key'] = 'value'; + $metadata->setSource('test.txt'); + + $this->assertSame('value', $document->metadata['key']); + $this->assertSame('test.txt', $document->metadata->getSource()); + } + + #[DataProvider('uuidVersionProvider')] + #[TestDox('Accepts UUID version $version')] + public function testDifferentUuidVersions(string $version, Uuid $uuid) + { + $content = 'Test content'; + + $document = new TextDocument($uuid, $content); + + $this->assertSame($uuid, $document->id); + $this->assertSame($content, $document->content); + } + + /** + * @return \Iterator