@monkeyscanjump/cloudflare-dyndns
Version:
A robust TypeScript application that automatically updates Cloudflare DNS records when your public IP address changes. Perfect for maintaining consistent domain names for home servers, WireGuard VPN, self-hosted services, or any system with a dynamic IP a
89 lines • 3.27 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const CloudflareService_1 = require("../services/CloudflareService");
const Logger_1 = require("../utils/Logger");
const axios_1 = __importDefault(require("axios"));
jest.mock('axios');
jest.mock('../utils/Logger');
describe('CloudflareService', () => {
let mockLogger;
let config;
let cloudflareService;
beforeEach(() => {
mockLogger = new Logger_1.Logger('test.log');
config = {
API_TOKEN: 'test-token',
ZONE_ID: 'zone-id',
RECORD_ID: 'record-id',
DOMAIN: 'example.com',
SUBDOMAIN: 'test',
FQDN: 'test.example.com',
TTL: 120,
PROXIED: false,
RETRY_ATTEMPTS: 3,
RETRY_DELAY: 100,
LOG_FILE: 'test.log',
LAST_IP_FILE: 'ip.txt',
IP_SERVICES: ['ipify']
};
cloudflareService = new CloudflareService_1.CloudflareService(config, mockLogger);
jest.resetAllMocks();
});
test('should initialize with auto-discovery', async () => {
// Mock the API responses for auto-discovery
axios_1.default.mockImplementation(() => {
return Promise.resolve({
data: {
success: true,
result: [{ id: 'discovered-zone-id', name: 'example.com' }]
}
});
});
// Remove IDs to trigger auto-discovery
const autoDiscoverConfig = { ...config };
delete autoDiscoverConfig.ZONE_ID;
delete autoDiscoverConfig.RECORD_ID;
const service = new CloudflareService_1.CloudflareService(autoDiscoverConfig, mockLogger);
const result = await service.initialize();
expect(result).toBe(true);
expect(axios_1.default).toHaveBeenCalled();
});
test('should update DNS record', async () => {
axios_1.default.mockImplementation(() => {
return Promise.resolve({
data: {
success: true,
result: { id: 'record-id' }
}
});
});
const result = await cloudflareService.updateDnsRecord('1.2.3.4');
expect(result).toBe(true);
expect(axios_1.default).toHaveBeenCalledWith(expect.objectContaining({
method: 'put',
data: expect.objectContaining({
content: '1.2.3.4'
})
}));
});
test('should handle API errors gracefully', async () => {
axios_1.default.mockImplementation(() => {
return Promise.reject({
response: {
status: 403,
data: {
success: false,
errors: [{ message: 'Access denied' }]
}
}
});
});
const result = await cloudflareService.updateDnsRecord('1.2.3.4');
expect(result).toBe(false);
expect(mockLogger.error).toHaveBeenCalled();
});
});
//# sourceMappingURL=CloudflareService.test.js.map