siteTitle = 'Test Site'; $config->siteDescription = 'Test Description'; $config->baseUrl = 'https://example.com'; $config->basePath = '/tkr/'; return $config; } private function createSampleTicks() { return [ ['id' => 1, 'timestamp' => '2025-01-15 12:00:00', 'tick' => 'First test tick'], ['id' => 2, 'timestamp' => '2025-01-15 13:00:00', 'tick' => 'Second test tick'] ]; } public function testCanGenerateValidAtom() { $config = $this->createMockConfig(); $ticks = $this->createSampleTicks(); $generator = new AtomGenerator($config, $ticks); $xml = $generator->generate(); // Test XML structure $this->assertStringStartsWith('assertStringContainsString('', $xml); $this->assertStringContainsString('Test Site Atom Feed', $xml); $this->assertStringContainsString('', $xml); $this->assertStringContainsString('assertStringContainsString('href="https://example.com/tkr/feed/atom"', $xml); $this->assertStringContainsString('https://example.com/tkr/', $xml); $this->assertStringContainsString('', $xml); $this->assertStringContainsString('Test Site', $xml); $this->assertStringContainsString('', $xml); $this->assertStringContainsString('', $xml); $this->assertStringEndsWith('' . "\n", $xml); // Test tick content $this->assertStringContainsString('First test tick', $xml); $this->assertStringContainsString('Second test tick', $xml); // Ensure the XML is still valid $doc = new DOMDocument(); $this->assertTrue($doc->loadXML($xml), 'Valid Atom should load into an XML document'); } public function testReturnsCorrectContentType() { $generator = new AtomGenerator($this->createMockConfig(), []); $this->assertEquals('application/atom+xml; charset=utf-8', $generator->getContentType()); } public function testCanHandleEmptyTickList() { $config = $this->createMockConfig(); $generator = new AtomGenerator($config, []); $xml = $generator->generate(); // Should still be valid Atom with no entries // Test XML structure $this->assertStringStartsWith('assertStringContainsString('', $xml); $this->assertStringContainsString('Test Site Atom Feed', $xml); $this->assertStringContainsString('', $xml); $this->assertStringContainsString('assertStringContainsString('href="https://example.com/tkr/feed/atom"', $xml); $this->assertStringContainsString('https://example.com/tkr/', $xml); $this->assertStringContainsString('', $xml); $this->assertStringContainsString('Test Site', $xml); $this->assertStringEndsWith('' . "\n", $xml); // Test tick content $this->assertStringNotContainsString('', $xml); $this->assertStringNotContainsString('', $xml); // Ensure the XML is still valid $doc = new DOMDocument(); $this->assertTrue($doc->loadXML($xml), 'XML with no entries should still be valid'); } public function testCanHandleSpecialCharactersAndUnicode() { $config = $this->createMockConfig(); // Test various challenging characters $ticks = [ [ 'id' => 1, 'timestamp' => '2025-01-15 12:00:00', 'tick' => 'Testing emojis 🎉🔥💯 and unicode characters' ], [ 'id' => 2, 'timestamp' => '2025-01-15 13:00:00', 'tick' => 'XML entities: & "quotes" & \'apostrophes\'' ], [ 'id' => 3, 'timestamp' => '2025-01-15 14:00:00', 'tick' => 'International: café naïve résumé 北京 москва' ], [ 'id' => 4, 'timestamp' => '2025-01-15 15:00:00', 'tick' => 'Math symbols: ∑ ∆ π ∞ ≠ ≤ ≥' ] ]; $generator = new AtomGenerator($config, $ticks); $xml = $generator->generate(); // Test that emojis are preserved $this->assertStringContainsString('🎉🔥💯', $xml); // Test that XML entities are properly escaped $this->assertStringContainsString('<tag>', $xml); $this->assertStringContainsString('&', $xml); $this->assertStringContainsString('"quotes"', $xml); $this->assertStringContainsString(''apostrophes'', $xml); // Test that international characters are preserved $this->assertStringContainsString('café naïve résumé', $xml); $this->assertStringContainsString('北京', $xml); $this->assertStringContainsString('москва', $xml); // Test that math symbols are preserved $this->assertStringContainsString('∑ ∆ π ∞', $xml); // Ensure no raw < > & characters (security) $this->assertStringNotContainsString('', $xml); $this->assertStringNotContainsString(' & "', $xml); // Ensure the XML is still valid $doc = new DOMDocument(); $this->assertTrue($doc->loadXML($xml), 'XML with Unicode should still be valid'); } }