You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

289 lines
10 KiB

/**
* Platform Configuration Tests
*
* Tests for TimeSafari-specific platform configurations including
* Android and iOS platform settings.
*
* @author Matthew Raymer
* @version 1.0.0
*/
import {
TimeSafariAndroidConfigManager,
TimeSafariAndroidConfig
} from '../android/timesafari-android-config';
import {
TimeSafariIOSConfigManager,
TimeSafariIOSConfig
} from '../ios/timesafari-ios-config';
describe('Platform Configuration', () => {
describe('Android Configuration', () => {
let androidConfig: TimeSafariAndroidConfigManager;
beforeEach(() => {
androidConfig = new TimeSafariAndroidConfigManager();
});
test('should initialize with default configuration', () => {
expect(androidConfig).toBeDefined();
const notificationChannels = androidConfig.getAllNotificationChannels();
expect(notificationChannels).toHaveLength(5);
expect(notificationChannels[0].id).toBe('timesafari_community_updates');
expect(notificationChannels[0].name).toBe('TimeSafari Community Updates');
expect(notificationChannels[0].importance).toBe('default');
});
test('should get notification channels configuration', () => {
const channels = androidConfig.getAllNotificationChannels();
expect(channels).toHaveLength(5);
const communityChannel = channels.find(c => c.id === 'timesafari_community_updates');
expect(communityChannel).toBeDefined();
expect(communityChannel?.name).toBe('TimeSafari Community Updates');
expect(communityChannel?.importance).toBe('default');
expect(communityChannel?.sound).toBe('default');
expect(communityChannel?.enableVibration).toBe(true);
});
test('should get required permissions', () => {
const permissions = androidConfig.getRequiredPermissions();
expect(permissions.some(p => p.name === 'android.permission.POST_NOTIFICATIONS')).toBe(true);
expect(permissions.some(p => p.name === 'android.permission.SCHEDULE_EXACT_ALARM')).toBe(true);
expect(permissions.some(p => p.name === 'android.permission.WAKE_LOCK')).toBe(true);
expect(permissions.some(p => p.name === 'android.permission.RECEIVE_BOOT_COMPLETED')).toBe(true);
});
test('should get battery optimization settings', () => {
const batterySettings = androidConfig.getBatteryOptimizationConfig();
expect(batterySettings.exemptPackages).toContain('com.timesafari.dailynotification');
expect(batterySettings.whitelistRequestMessage).toBeDefined();
expect(batterySettings.optimizationCheckInterval).toBeGreaterThan(0);
});
test('should get WorkManager constraints', () => {
const constraints = androidConfig.getWorkManagerConstraints();
expect(constraints.networkType).toBe('connected');
expect(constraints.requiresBatteryNotLow).toBe(false);
expect(constraints.requiresCharging).toBe(false);
expect(constraints.requiresDeviceIdle).toBe(false);
expect(constraints.requiresStorageNotLow).toBe(true);
});
test('should update configuration', () => {
const updates: Partial<TimeSafariAndroidConfig> = {
notificationChannels: [
{
id: 'custom_channel',
name: 'Custom Channel',
description: 'Custom notification channel',
importance: 'default',
enableLights: false,
enableVibration: false,
lightColor: '#000000',
sound: null,
showBadge: true,
bypassDnd: false,
lockscreenVisibility: 'public'
}
]
};
androidConfig.updateConfig(updates);
const channels = androidConfig.getAllNotificationChannels();
expect(channels).toHaveLength(1);
expect(channels[0].id).toBe('custom_channel');
});
test('should validate configuration', () => {
const validation = androidConfig.validateConfig();
expect(validation.valid).toBe(true);
expect(validation.errors).toEqual([]);
});
test('should handle configuration updates', () => {
const updates: Partial<TimeSafariAndroidConfig> = {
notificationChannels: [
{
id: 'test_channel',
name: 'Test Channel',
description: 'Test channel',
importance: 'default',
enableLights: false,
enableVibration: true,
lightColor: '#000000',
sound: 'default',
showBadge: true,
bypassDnd: false,
lockscreenVisibility: 'public'
}
]
};
androidConfig.updateConfig(updates);
const validation = androidConfig.validateConfig();
expect(validation.valid).toBe(true);
});
});
describe('iOS Configuration', () => {
let iosConfig: TimeSafariIOSConfigManager;
beforeEach(() => {
iosConfig = new TimeSafariIOSConfigManager();
});
test('should initialize with default configuration', () => {
expect(iosConfig).toBeDefined();
const notificationCategories = iosConfig.getAllNotificationCategories();
expect(notificationCategories).toHaveLength(4);
expect(notificationCategories[0].identifier).toBe('TIMESAFARI_COMMUNITY_UPDATE');
expect(notificationCategories[0].actions).toHaveLength(3);
});
test('should get notification categories configuration', () => {
const categories = iosConfig.getAllNotificationCategories();
expect(categories).toHaveLength(4);
const communityCategory = categories.find(c => c.identifier === 'TIMESAFARI_COMMUNITY_UPDATE');
expect(communityCategory).toBeDefined();
expect(communityCategory?.actions).toHaveLength(3);
expect(communityCategory?.intentIdentifiers).toEqual([]);
});
test('should get background tasks', () => {
const backgroundTasks = iosConfig.getAllBackgroundTasks();
expect(backgroundTasks).toHaveLength(2);
expect(backgroundTasks[0].identifier).toBe('com.timesafari.dailynotification.fetch');
expect(backgroundTasks[1].identifier).toBe('com.timesafari.dailynotification.notify');
});
test('should update configuration', () => {
const updates: Partial<TimeSafariIOSConfig> = {
notificationCategories: [
{
identifier: 'custom_category',
actions: [
{
identifier: 'CUSTOM_ACTION',
title: 'Custom Action',
options: {
foreground: true,
destructive: false,
authenticationRequired: false
}
}
],
intentIdentifiers: ['CUSTOM_INTENT'],
hiddenPreviewsBodyPlaceholder: 'Custom placeholder',
categorySummaryFormat: '%u more',
options: {
customDismissAction: false,
allowInCarPlay: true,
allowAnnouncement: false,
showTitle: true,
showSubtitle: true,
showBody: true
}
}
]
};
iosConfig.updateConfig(updates);
const categories = iosConfig.getAllNotificationCategories();
expect(categories).toHaveLength(1);
expect(categories[0].identifier).toBe('custom_category');
});
test('should validate configuration', () => {
const validation = iosConfig.validateConfig();
expect(validation.valid).toBe(true);
expect(validation.errors).toEqual([]);
});
test('should handle configuration updates', () => {
const updates: Partial<TimeSafariIOSConfig> = {
notificationCategories: [
{
identifier: 'test_category',
actions: [
{
identifier: 'TEST_ACTION',
title: 'Test Action',
options: {
foreground: false,
destructive: false,
authenticationRequired: false
}
}
],
intentIdentifiers: [],
hiddenPreviewsBodyPlaceholder: 'Test',
categorySummaryFormat: '%u more',
options: {
customDismissAction: false,
allowInCarPlay: true,
allowAnnouncement: false,
showTitle: true,
showSubtitle: true,
showBody: true
}
}
]
};
iosConfig.updateConfig(updates);
const validation = iosConfig.validateConfig();
expect(validation.valid).toBe(true);
});
});
describe('Cross-Platform Consistency', () => {
test('should have consistent notification channel/category structure', () => {
const androidConfig = new TimeSafariAndroidConfigManager();
const iosConfig = new TimeSafariIOSConfigManager();
const androidChannels = androidConfig.getAllNotificationChannels();
const iosCategories = iosConfig.getAllNotificationCategories();
// Both should have notification types (may have different counts)
expect(androidChannels.length).toBeGreaterThan(0);
expect(iosCategories.length).toBeGreaterThan(0);
// Both should have community updates as the first item
expect(androidChannels[0].id).toBe('timesafari_community_updates');
expect(iosCategories[0].identifier).toBe('TIMESAFARI_COMMUNITY_UPDATE');
});
test('should have consistent permission requirements', () => {
const androidConfig = new TimeSafariAndroidConfigManager();
const iosConfig = new TimeSafariIOSConfigManager();
const androidPermissions = androidConfig.getRequiredPermissions();
const iosCategories = iosConfig.getAllNotificationCategories();
// Both should require notification permissions
expect(androidPermissions.some(p => p.name === 'android.permission.POST_NOTIFICATIONS')).toBe(true);
expect(iosCategories.length).toBeGreaterThan(0);
});
test('should have consistent background task support', () => {
const androidConfig = new TimeSafariAndroidConfigManager();
const iosConfig = new TimeSafariIOSConfigManager();
const androidConstraints = androidConfig.getWorkManagerConstraints();
const iosBackgroundTasks = iosConfig.getAllBackgroundTasks();
// Both should support background processing
expect(androidConstraints.networkType).toBe('connected');
expect(iosBackgroundTasks.length).toBeGreaterThan(0);
});
});
});