lightweight-browser-load-tester
Version:
A lightweight load testing tool using real browsers for streaming applications with DRM support
300 lines (272 loc) • 11.2 kB
text/typescript
import { describe, it, expect } from 'vitest';
import { ConfigurationManager } from './index';
describe('localStorage Configuration', () => {
describe('validation', () => {
it('should validate valid localStorage configuration', async () => {
const config = {
concurrentUsers: 1,
testDuration: 60,
rampUpTime: 10,
streamingUrl: 'https://example.com/stream',
localStorage: [
{
domain: 'example.com',
data: {
'auth_token': 'token123',
'user_id': '456'
}
}
],
resourceLimits: {
maxMemoryPerInstance: 512,
maxCpuPercentage: 80,
maxConcurrentInstances: 10
}
};
// Use schema validation directly instead of parseConfiguration
const schema = ConfigurationManager.getValidationSchema();
const { error } = schema.validate(config);
// Should not have validation errors
expect(error).toBeUndefined();
});
it('should validate multiple localStorage domains', async () => {
const validConfig = {
concurrentUsers: 1,
testDuration: 60,
rampUpTime: 10,
streamingUrl: 'https://example.com/stream',
localStorage: [
{
domain: 'app.example.com',
data: {
'session_id': 'sess123'
}
},
{
domain: 'api.example.com',
data: {
'api_key': 'key456',
'version': 'v2'
}
}
],
resourceLimits: {
maxMemoryPerInstance: 512,
maxCpuPercentage: 80,
maxConcurrentInstances: 10
}
};
// Should validate without errors
const schema = ConfigurationManager.getValidationSchema();
const { error } = schema.validate(validConfig);
expect(error).toBeUndefined();
});
it('should reject localStorage with missing domain', async () => {
const invalidConfig = {
concurrentUsers: 1,
testDuration: 60,
rampUpTime: 10,
streamingUrl: 'https://example.com/stream',
localStorage: [
{
// Missing domain
data: {
'auth_token': 'token123'
}
}
],
resourceLimits: {
maxMemoryPerInstance: 512,
maxCpuPercentage: 80,
maxConcurrentInstances: 10
}
};
const schema = ConfigurationManager.getValidationSchema();
const { error } = schema.validate(invalidConfig);
expect(error).toBeDefined();
expect(error?.details[0].message).toContain('domain');
});
it('should reject localStorage with missing data', async () => {
const invalidConfig = {
concurrentUsers: 1,
testDuration: 60,
rampUpTime: 10,
streamingUrl: 'https://example.com/stream',
localStorage: [
{
domain: 'example.com'
// Missing data
}
],
resourceLimits: {
maxMemoryPerInstance: 512,
maxCpuPercentage: 80,
maxConcurrentInstances: 10
}
};
const schema = ConfigurationManager.getValidationSchema();
const { error } = schema.validate(invalidConfig);
expect(error).toBeDefined();
expect(error?.details[0].message).toContain('data');
});
it('should reject localStorage with non-string data values', async () => {
const invalidConfig = {
concurrentUsers: 1,
testDuration: 60,
rampUpTime: 10,
streamingUrl: 'https://example.com/stream',
localStorage: [
{
domain: 'example.com',
data: {
'auth_token': 'token123',
'user_id': 456, // Should be string
'is_active': true // Should be string
}
}
],
resourceLimits: {
maxMemoryPerInstance: 512,
maxCpuPercentage: 80,
maxConcurrentInstances: 10
}
};
const schema = ConfigurationManager.getValidationSchema();
const { error } = schema.validate(invalidConfig);
expect(error).toBeDefined();
expect(error?.details.some(detail => detail.message.includes('string'))).toBe(true);
});
it('should accept empty localStorage array', async () => {
const validConfig = {
concurrentUsers: 1,
testDuration: 60,
rampUpTime: 10,
streamingUrl: 'https://example.com/stream',
localStorage: [], // Empty array should be valid
resourceLimits: {
maxMemoryPerInstance: 512,
maxCpuPercentage: 80,
maxConcurrentInstances: 10
}
};
const schema = ConfigurationManager.getValidationSchema();
const { error } = schema.validate(validConfig);
expect(error).toBeUndefined();
});
it('should use default empty array when localStorage is not specified', async () => {
const configWithoutLocalStorage = {
concurrentUsers: 1,
testDuration: 60,
rampUpTime: 10,
streamingUrl: 'https://example.com/stream',
resourceLimits: {
maxMemoryPerInstance: 512,
maxCpuPercentage: 80,
maxConcurrentInstances: 10
}
};
const schema = ConfigurationManager.getValidationSchema();
const { error, value } = schema.validate(configWithoutLocalStorage);
expect(error).toBeUndefined();
expect(value.localStorage).toEqual([]);
});
});
describe('example configuration generation', () => {
it('should include localStorage in generated YAML example', () => {
const yamlExample = ConfigurationManager.generateExampleConfig('yaml');
expect(yamlExample).toContain('localStorage:');
expect(yamlExample).toContain('domain: example.com');
expect(yamlExample).toContain('auth_token:');
expect(yamlExample).toContain('user_id:');
expect(yamlExample).toContain('session_id:');
});
it('should include localStorage in generated JSON example', () => {
const jsonExample = ConfigurationManager.generateExampleConfig('json');
const parsed = JSON.parse(jsonExample);
expect(parsed.localStorage).toBeDefined();
expect(Array.isArray(parsed.localStorage)).toBe(true);
expect(parsed.localStorage.length).toBeGreaterThan(0);
const firstEntry = parsed.localStorage[0];
expect(firstEntry.domain).toBeDefined();
expect(firstEntry.data).toBeDefined();
expect(typeof firstEntry.data).toBe('object');
});
});
describe('complex localStorage scenarios', () => {
it('should validate localStorage with JSON-stringified values', async () => {
const config = {
concurrentUsers: 1,
testDuration: 60,
rampUpTime: 10,
streamingUrl: 'https://example.com/stream',
localStorage: [
{
domain: 'complex.example.com',
data: {
'user_preferences': '{"theme":"dark","language":"en"}',
'cart_items': '[{"id":"123","quantity":2}]',
'simple_value': 'test'
}
}
],
resourceLimits: {
maxMemoryPerInstance: 512,
maxCpuPercentage: 80,
maxConcurrentInstances: 10
}
};
const schema = ConfigurationManager.getValidationSchema();
const { error } = schema.validate(config);
expect(error).toBeUndefined();
});
it('should validate localStorage with many domains', async () => {
const localStorage = [];
for (let i = 0; i < 10; i++) {
localStorage.push({
domain: `domain${i}.example.com`,
data: {
[`key${i}`]: `value${i}`,
'common_key': 'common_value'
}
});
}
const config = {
concurrentUsers: 1,
testDuration: 60,
rampUpTime: 10,
streamingUrl: 'https://example.com/stream',
localStorage,
resourceLimits: {
maxMemoryPerInstance: 512,
maxCpuPercentage: 80,
maxConcurrentInstances: 10
}
};
const schema = ConfigurationManager.getValidationSchema();
const { error } = schema.validate(config);
expect(error).toBeUndefined();
});
it('should validate localStorage with empty data object', async () => {
const config = {
concurrentUsers: 1,
testDuration: 60,
rampUpTime: 10,
streamingUrl: 'https://example.com/stream',
localStorage: [
{
domain: 'empty.example.com',
data: {} // Empty data object should be valid
}
],
resourceLimits: {
maxMemoryPerInstance: 512,
maxCpuPercentage: 80,
maxConcurrentInstances: 10
}
};
const schema = ConfigurationManager.getValidationSchema();
const { error } = schema.validate(config);
expect(error).toBeUndefined();
});
});
});