135 lines
3.6 KiB
TypeScript
135 lines
3.6 KiB
TypeScript
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
import path from 'path';
|
|
import fs from 'fs';
|
|
|
|
/**
|
|
* Integration tests for the scheduler
|
|
* These tests verify the scheduler behavior with mocked browser contexts
|
|
*/
|
|
describe('Scheduler Integration Tests', () => {
|
|
const mockAuthPath = path.join(__dirname, '../../__mocks__/auth.json');
|
|
const mockAuthDir = path.dirname(mockAuthPath);
|
|
|
|
beforeEach(() => {
|
|
// Create mock directory structure
|
|
if (!fs.existsSync(mockAuthDir)) {
|
|
fs.mkdirSync(mockAuthDir, { recursive: true });
|
|
}
|
|
|
|
// Create mock auth.json
|
|
const mockAuth = {
|
|
cookies: [
|
|
{
|
|
name: 'sessionid',
|
|
value: 'mock-session-id',
|
|
domain: '.instagram.com',
|
|
path: '/',
|
|
expires: Date.now() / 1000 + 3600 * 24 * 30, // 30 days
|
|
httpOnly: true,
|
|
secure: true,
|
|
sameSite: 'Strict'
|
|
}
|
|
],
|
|
origins: []
|
|
};
|
|
|
|
fs.writeFileSync(mockAuthPath, JSON.stringify(mockAuth, null, 2));
|
|
});
|
|
|
|
afterEach(() => {
|
|
// Cleanup mock files
|
|
if (fs.existsSync(mockAuthPath)) {
|
|
fs.unlinkSync(mockAuthPath);
|
|
}
|
|
if (fs.existsSync(mockAuthDir) && fs.readdirSync(mockAuthDir).length === 0) {
|
|
fs.rmdirSync(mockAuthDir);
|
|
}
|
|
});
|
|
|
|
describe('Auth File Management', () => {
|
|
it('should detect existing auth.json file', () => {
|
|
const exists = fs.existsSync(mockAuthPath);
|
|
expect(exists).toBe(true);
|
|
});
|
|
|
|
it('should preserve auth.json structure when renewed', () => {
|
|
const authContent = JSON.parse(fs.readFileSync(mockAuthPath, 'utf-8'));
|
|
|
|
expect(authContent).toHaveProperty('cookies');
|
|
expect(authContent).toHaveProperty('origins');
|
|
expect(Array.isArray(authContent.cookies)).toBe(true);
|
|
});
|
|
|
|
it('should create secrets directory if it does not exist', () => {
|
|
const secretsDir = path.join(__dirname, '../../__mocks__/secrets');
|
|
|
|
if (!fs.existsSync(secretsDir)) {
|
|
fs.mkdirSync(secretsDir, { recursive: true });
|
|
}
|
|
|
|
expect(fs.existsSync(secretsDir)).toBe(true);
|
|
|
|
// Cleanup
|
|
if (fs.readdirSync(secretsDir).length === 0) {
|
|
fs.rmdirSync(secretsDir);
|
|
}
|
|
});
|
|
});
|
|
|
|
describe('Scheduler Timing', () => {
|
|
it('should calculate correct interval from hours', () => {
|
|
const hours = 12;
|
|
const expectedMs = hours * 60 * 60 * 1000;
|
|
|
|
expect(expectedMs).toBe(43200000);
|
|
});
|
|
|
|
it('should support 6-hour renewal interval', () => {
|
|
const hours = 6;
|
|
const expectedMs = hours * 60 * 60 * 1000;
|
|
|
|
expect(expectedMs).toBe(21600000);
|
|
});
|
|
|
|
it('should support 24-hour renewal interval', () => {
|
|
const hours = 24;
|
|
const expectedMs = hours * 60 * 60 * 1000;
|
|
|
|
expect(expectedMs).toBe(86400000);
|
|
});
|
|
});
|
|
|
|
describe('Error Handling', () => {
|
|
it('should handle missing auth.json gracefully', () => {
|
|
const nonExistentPath = path.join(__dirname, '../../__mocks__/nonexistent.json');
|
|
const exists = fs.existsSync(nonExistentPath);
|
|
|
|
expect(exists).toBe(false);
|
|
});
|
|
|
|
it('should validate auth.json structure', () => {
|
|
const authContent = JSON.parse(fs.readFileSync(mockAuthPath, 'utf-8'));
|
|
|
|
const hasRequiredFields = 'cookies' in authContent && 'origins' in authContent;
|
|
expect(hasRequiredFields).toBe(true);
|
|
});
|
|
});
|
|
|
|
describe('Path Resolution', () => {
|
|
it('should resolve Docker auth path when it exists', () => {
|
|
// This would be tested with actual file system mocks
|
|
const dockerPath = '/app/secrets/auth.json';
|
|
const localPath = './secrets/auth.json';
|
|
|
|
// In real scenario, mock fs.existsSync to return true for dockerPath
|
|
expect(dockerPath).toMatch(/\/app\/secrets\/auth\.json/);
|
|
});
|
|
|
|
it('should fall back to local path', () => {
|
|
const localPath = './secrets/auth.json';
|
|
|
|
expect(localPath).toMatch(/\.\/secrets\/auth\.json/);
|
|
});
|
|
});
|
|
});
|