Initial Version of sitemap.xml spec
This commit is contained in:
136
tests/integration/sitemap-endpoint.test.js
Normal file
136
tests/integration/sitemap-endpoint.test.js
Normal file
@@ -0,0 +1,136 @@
|
||||
/**
|
||||
* Integration Tests: /sitemap.xml Endpoint
|
||||
*
|
||||
* Tests T024, T030: End-to-end tests for sitemap generation
|
||||
* Tests the complete flow: HTTP request → auth → Drive API → sitemap generation → HTTP response
|
||||
*
|
||||
* @module tests/integration/sitemap-endpoint
|
||||
*/
|
||||
|
||||
import { describe, it, before, after } from 'node:test';
|
||||
import assert from 'node:assert/strict';
|
||||
import http from 'node:http';
|
||||
|
||||
// =============================================================================
|
||||
// T024: Integration test for /sitemap.xml endpoint success scenario
|
||||
// =============================================================================
|
||||
|
||||
describe('T024: /sitemap.xml Endpoint Success Integration', () => {
|
||||
let server;
|
||||
const TEST_PORT = 3001;
|
||||
|
||||
before(async () => {
|
||||
// TODO: Start server with mocked Drive API
|
||||
// This will be implemented when src/server.js is complete
|
||||
});
|
||||
|
||||
after(async () => {
|
||||
// TODO: Stop server
|
||||
if (server) {
|
||||
server.close();
|
||||
}
|
||||
});
|
||||
|
||||
it('should return 200 with valid sitemap XML when Drive API returns documents', async () => {
|
||||
// Mock Drive API to return sample documents
|
||||
const mockDriveDocuments = [
|
||||
{
|
||||
id: 'doc1',
|
||||
name: 'Test Document 1',
|
||||
mimeType: 'application/pdf',
|
||||
modifiedTime: '2024-03-01T10:30:00Z'
|
||||
},
|
||||
{
|
||||
id: 'doc2',
|
||||
name: 'Test Document 2',
|
||||
mimeType: 'text/plain',
|
||||
modifiedTime: '2024-03-02T15:45:00Z'
|
||||
}
|
||||
];
|
||||
|
||||
// Make HTTP request to /sitemap.xml
|
||||
const response = await makeRequest(`http://localhost:${TEST_PORT}/sitemap.xml`);
|
||||
|
||||
// Verify response
|
||||
assert.equal(response.statusCode, 200, 'Should return 200 OK');
|
||||
assert.equal(
|
||||
response.headers['content-type'],
|
||||
'application/xml; charset=utf-8',
|
||||
'Should return XML content type'
|
||||
);
|
||||
|
||||
// Verify XML structure
|
||||
assert.match(response.body, /<urlset xmlns="http:\/\/www\.sitemaps\.org\/schemas\/sitemap\/0\.9">/, 'Should have valid urlset');
|
||||
assert.match(response.body, /<url>/, 'Should contain URL entries');
|
||||
assert.match(response.body, /<loc>.*\/documents\/doc1<\/loc>/, 'Should contain doc1 URL');
|
||||
assert.match(response.body, /<loc>.*\/documents\/doc2<\/loc>/, 'Should contain doc2 URL');
|
||||
assert.match(response.body, /<lastmod>2024-03-01<\/lastmod>/, 'Should contain formatted lastmod');
|
||||
});
|
||||
|
||||
it('should return 200 with empty sitemap when Drive has no documents', async () => {
|
||||
// Mock Drive API to return empty result
|
||||
const response = await makeRequest(`http://localhost:${TEST_PORT}/sitemap.xml`);
|
||||
|
||||
assert.equal(response.statusCode, 200, 'Should return 200 OK for empty Drive');
|
||||
assert.match(response.body, /<urlset xmlns="http:\/\/www\.sitemaps\.org\/schemas\/sitemap\/0\.9">/, 'Should have urlset');
|
||||
assert.match(response.body, /<\/urlset>/, 'Should close urlset');
|
||||
assert.doesNotMatch(response.body, /<url>/, 'Should not contain any url entries');
|
||||
});
|
||||
});
|
||||
|
||||
// =============================================================================
|
||||
// T030: Integration test for Service Account token refresh
|
||||
// =============================================================================
|
||||
|
||||
describe('T030: Service Account Token Refresh Integration', () => {
|
||||
it('should handle token expiry and refresh automatically', async () => {
|
||||
// Mock scenario: first request succeeds, token expires, second request triggers refresh
|
||||
|
||||
// First request - should succeed with valid token
|
||||
const response1 = await makeRequest(`http://localhost:${TEST_PORT}/sitemap.xml`);
|
||||
assert.equal(response1.statusCode, 200, 'First request should succeed');
|
||||
|
||||
// TODO: Mock token expiry by manipulating auth client
|
||||
|
||||
// Second request - should auto-refresh token and succeed
|
||||
const response2 = await makeRequest(`http://localhost:${TEST_PORT}/sitemap.xml`);
|
||||
assert.equal(response2.statusCode, 200, 'Second request should succeed after token refresh');
|
||||
});
|
||||
|
||||
it('should return 401 if token refresh fails', async () => {
|
||||
// Mock scenario: token expires and refresh fails (invalid credentials)
|
||||
|
||||
// TODO: Mock googleapis auth to fail on refresh
|
||||
|
||||
const response = await makeRequest(`http://localhost:${TEST_PORT}/sitemap.xml`);
|
||||
assert.equal(response.statusCode, 401, 'Should return 401 when auth fails');
|
||||
|
||||
// Verify no response body (per spec: status code only errors)
|
||||
assert.equal(response.body, '', 'Should have no response body for errors');
|
||||
});
|
||||
});
|
||||
|
||||
// =============================================================================
|
||||
// Helper Functions
|
||||
// =============================================================================
|
||||
|
||||
/**
|
||||
* Make HTTP request and return response
|
||||
* @param {string} url - Full URL to request
|
||||
* @returns {Promise<Object>} Response object with statusCode, headers, body
|
||||
*/
|
||||
function makeRequest(url) {
|
||||
return new Promise((resolve, reject) => {
|
||||
http.get(url, (res) => {
|
||||
let body = '';
|
||||
res.on('data', chunk => body += chunk);
|
||||
res.on('end', () => {
|
||||
resolve({
|
||||
statusCode: res.statusCode,
|
||||
headers: res.headers,
|
||||
body
|
||||
});
|
||||
});
|
||||
}).on('error', reject);
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user