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']
];
}
private function createTestGenerator($config = null, $ticks = null) {
$config = $config ?? $this->createMockConfig();
$ticks = $ticks ?? $this->createSampleTicks();
return new class($config, $ticks) extends FeedGenerator {
public function generate(): string {
return 'content';
}
public function getContentType(): string {
return 'application/test+xml';
}
// Expose protected methods for testing
public function testBuildTickUrl(int $tickId): string {
return $this->buildTickUrl($tickId);
}
public function testGetSiteUrl(): string {
return $this->getSiteUrl();
}
};
}
public function testConstructorStoresConfigAndTicks() {
$generator = $this->createTestGenerator();
$this->assertEquals('content', $generator->generate());
$this->assertEquals('application/test+xml', $generator->getContentType());
}
public function testBuildTickUrlGeneratesCorrectUrl() {
$generator = $this->createTestGenerator();
$tickUrl = $generator->testBuildTickUrl(123);
$this->assertEquals('https://example.com/tkr/tick/123', $tickUrl);
}
public function testGetSiteUrlGeneratesCorrectUrl() {
$generator = $this->createTestGenerator();
$siteUrl = $generator->testGetSiteUrl();
$this->assertEquals('https://example.com/tkr/', $siteUrl);
}
public function testUrlMethodsHandleSubdomainConfiguration() {
$config = new ConfigModel();
$config->siteTitle = 'Test Site';
$config->baseUrl = 'https://tkr.example.com';
$config->basePath = '/';
$generator = $this->createTestGenerator($config, []);
$this->assertEquals('https://tkr.example.com/', $generator->testGetSiteUrl());
$this->assertEquals('https://tkr.example.com/tick/456', $generator->testBuildTickUrl(456));
}
public function testUrlMethodsHandleEmptyBasePath() {
$config = new ConfigModel();
$config->siteTitle = 'Test Site';
$config->baseUrl = 'https://example.com';
$config->basePath = '';
$generator = $this->createTestGenerator($config, []);
$this->assertEquals('https://example.com/', $generator->testGetSiteUrl());
$this->assertEquals('https://example.com/tick/789', $generator->testBuildTickUrl(789));
}
public function testUrlMethodsHandleVariousBasePathFormats() {
$testCases = [
// [basePath, expectedSiteUrl, expectedTickUrl]
['', 'https://example.com/', 'https://example.com/tick/123'],
['/', 'https://example.com/', 'https://example.com/tick/123'],
['tkr', 'https://example.com/tkr/', 'https://example.com/tkr/tick/123'],
['/tkr', 'https://example.com/tkr/', 'https://example.com/tkr/tick/123'],
['tkr/', 'https://example.com/tkr/', 'https://example.com/tkr/tick/123'],
['/tkr/', 'https://example.com/tkr/', 'https://example.com/tkr/tick/123'],
];
foreach ($testCases as [$basePath, $expectedSiteUrl, $expectedTickUrl]) {
$config = new ConfigModel();
$config->siteTitle = 'Test Site';
$config->baseUrl = 'https://example.com';
$config->basePath = $basePath;
$generator = $this->createTestGenerator($config, []);
$this->assertEquals($expectedSiteUrl, $generator->testGetSiteUrl(), "Failed for basePath: '$basePath'");
$this->assertEquals($expectedTickUrl, $generator->testBuildTickUrl(123), "Failed for basePath: '$basePath'");
}
}
}