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.
 
 
 
 
 
 

232 lines
6.1 KiB

/**
* Test User Zero Configuration
*
* Based on TimeSafari crowd-master User Zero configuration
* This provides the necessary credentials and settings for testing
* the daily notification plugin with stars querying functionality.
*
* @author Matthew Raymer
* @version 1.0.0
*/
export const TEST_USER_ZERO_CONFIG = {
// User Zero Identity (from crowd-master testUtils.ts)
identity: {
did: "did:ethr:0x0000694B58C2cC69658993A90D3840C560f2F51F",
name: "User Zero",
seedPhrase: "rigid shrug mobile smart veteran half all pond toilet brave review universe ship congress found yard skate elite apology jar uniform subway slender luggage"
},
// API Configuration
api: {
// Use staging API server for testing
server: "https://api-staging.timesafari.com",
// Stars querying endpoint (from crowd-master endorserServer.ts)
starsEndpoint: "/api/v2/report/plansLastUpdatedBetween",
// Authentication
jwtExpirationMinutes: 1, // Short-lived tokens like crowd-master
jwtAlgorithm: "HS256"
},
// Test Starred Projects (mock data for testing)
starredProjects: {
// Sample starred project IDs for testing
planIds: [
"test_project_1",
"test_project_2",
"test_project_3",
"demo_project_alpha",
"demo_project_beta"
],
// Last acknowledged JWT ID (for pagination testing)
lastAckedJwtId: "1704067200_abc123_def45678"
},
// Notification Configuration
notifications: {
// Fetch timing: 5 minutes before notification (as requested)
fetchLeadTimeMinutes: 5,
// Schedule time for testing
scheduleTime: "09:00",
// Test notification content
defaultTitle: "Daily Stars Update",
defaultBody: "New changes detected in your starred projects!"
},
// Testing Configuration
testing: {
// Enable mock responses for offline testing
enableMockResponses: true,
// Network timeouts
timeoutMs: 30000,
retryAttempts: 3,
retryDelayMs: 1000,
// Debug settings
debugMode: true,
logLevel: "INFO"
}
} as const;
/**
* Mock starred projects response for offline testing
* Based on crowd-master test fixtures
*/
export const MOCK_STARRED_PROJECTS_RESPONSE = {
data: [
{
planSummary: {
jwtId: "1704067200_abc123_def45678",
handleId: "test_project_1",
name: "Test Project 1",
description: "First test project for User Zero",
issuerDid: "did:key:test_issuer_1",
agentDid: "did:key:test_agent_1",
startTime: "2025-01-01T00:00:00Z",
endTime: "2025-01-31T23:59:59Z",
locLat: 40.7128,
locLon: -74.0060,
url: "https://test-project-1.com"
},
previousClaim: {
jwtId: "1703980800_xyz789_0badf00d",
claimType: "project_update"
}
},
{
planSummary: {
jwtId: "1704153600_mno345_0badf00d",
handleId: "test_project_2",
name: "Test Project 2",
description: "Second test project for User Zero",
issuerDid: "did:key:test_issuer_2",
agentDid: "did:key:test_agent_2",
startTime: "2025-02-01T00:00:00Z",
endTime: "2025-02-28T23:59:59Z",
locLat: null,
locLon: null
},
previousClaim: {
jwtId: "1704067200_stu901_1cafebad",
claimType: "project_update"
}
}
],
hitLimit: false,
pagination: {
hasMore: false,
nextAfterId: null
}
} as const;
/**
* Generate test JWT token for User Zero
* Mimics the crowd-master createEndorserJwtForDid function
*/
export function generateTestJWT(): string {
const nowEpoch = Math.floor(Date.now() / 1000);
const endEpoch = nowEpoch + TEST_USER_ZERO_CONFIG.api.jwtExpirationMinutes * 60;
const header = {
alg: TEST_USER_ZERO_CONFIG.api.jwtAlgorithm,
typ: "JWT"
};
const payload = {
exp: endEpoch,
iat: nowEpoch,
iss: TEST_USER_ZERO_CONFIG.identity.did,
sub: TEST_USER_ZERO_CONFIG.identity.did
};
// Simple base64 encoding for testing (not cryptographically secure)
const encodedHeader = btoa(JSON.stringify(header));
const encodedPayload = btoa(JSON.stringify(payload));
const signature = "test_signature_for_development_only";
return `${encodedHeader}.${encodedPayload}.${signature}`;
}
/**
* Test User Zero API client for stars querying
*/
export class TestUserZeroAPI {
private baseUrl: string;
private jwt: string;
constructor(baseUrl: string = TEST_USER_ZERO_CONFIG.api.server) {
this.baseUrl = baseUrl;
this.jwt = generateTestJWT();
}
/**
* Query starred projects for changes
* Mimics crowd-master getStarredProjectsWithChanges function
*/
async getStarredProjectsWithChanges(
starredPlanIds: string[],
afterId?: string
): Promise<typeof MOCK_STARRED_PROJECTS_RESPONSE> {
if (TEST_USER_ZERO_CONFIG.testing.enableMockResponses) {
// Return mock data for offline testing
console.log("🧪 Using mock starred projects response");
return MOCK_STARRED_PROJECTS_RESPONSE;
}
// Real API call (when mock is disabled)
const url = `${this.baseUrl}${TEST_USER_ZERO_CONFIG.api.starsEndpoint}`;
const headers = {
'Authorization': `Bearer ${this.jwt}`,
'Content-Type': 'application/json',
'User-Agent': 'TimeSafari-DailyNotificationPlugin/1.0.0'
};
const requestBody = {
planIds: starredPlanIds,
afterId: afterId || TEST_USER_ZERO_CONFIG.starredProjects.lastAckedJwtId
};
console.log("🌐 Making real API call to:", url);
console.log("📦 Request body:", requestBody);
const response = await fetch(url, {
method: 'POST',
headers,
body: JSON.stringify(requestBody)
});
if (!response.ok) {
throw new Error(`API call failed: ${response.status} ${response.statusText}`);
}
return await response.json();
}
/**
* Refresh JWT token
*/
refreshToken(): void {
this.jwt = generateTestJWT();
console.log("🔄 JWT token refreshed");
}
/**
* Get current JWT token
*/
getJWT(): string {
return this.jwt;
}
}
export default TEST_USER_ZERO_CONFIG;