/home/techb158/cosmic.abdallabala.com/tests
Edit: /home/techb158/cosmic.abdallabala.com/tests/integration-workflow.test.js (3703B)
const assert = require("assert");
const fs = require("fs");
const path = require("path");
const os = require("os");
const { JsonDatabase } = require("../src/storage/jsonDatabase.js");
const { IntegrationService } = require("../src/services/integrationService.js");
const source = path.join(__dirname, "..", "data", "database.json");
const temp = path.join(os.tmpdir(), `cosmic-integration-db-${Date.now()}.json`);
fs.copyFileSync(source, temp);
const database = new JsonDatabase(temp);
const integrations = new IntegrationService(database);
const projectId = "cosmic-ai-risk-001";
const providers = integrations.listSupportedProviders();
assert.deepStrictEqual(providers.map(item => item.provider), ["Trello", "Jira", "Asana", "Microsoft Planner"], "Supported providers should include Trello, Jira, Asana, and Microsoft Planner");
const seedIntegrations = integrations.listIntegrations(projectId);
assert.strictEqual(seedIntegrations.length, 4, "Project should seed four project-management integrations");
assert.ok(seedIntegrations.some(item => item.provider === "Trello"), "Trello integration should exist");
assert.ok(seedIntegrations.some(item => item.provider === "Jira"), "Jira integration should exist");
assert.ok(seedIntegrations.some(item => item.provider === "Asana"), "Asana integration should exist");
assert.ok(seedIntegrations.some(item => item.provider === "Microsoft Planner"), "Microsoft Planner integration should exist");
const trello = seedIntegrations.find(item => item.provider === "Trello");
const syncResult = integrations.syncIntegration(trello.id, {}, "USER-INTEGRATION");
assert.strictEqual(syncResult.integration.connectionStatus, "Connected", "Sync should mark integration as connected");
assert.strictEqual(syncResult.syncRun.status, "Completed", "Sync should complete without errors");
assert.strictEqual(syncResult.syncRun.createdCount, 35, "First sync should create one mapping per seed risk");
assert.strictEqual(syncResult.mappings.length, 35, "Sync result should include 35 Trello mappings");
const secondSync = integrations.syncIntegration(trello.id, {}, "USER-INTEGRATION");
assert.strictEqual(secondSync.syncRun.createdCount, 0, "Second sync should not create duplicate mappings");
assert.strictEqual(secondSync.syncRun.updatedCount, 35, "Second sync should update existing mappings");
const mappings = integrations.listMappings(projectId).filter(item => item.provider === "Trello");
assert.strictEqual(mappings.length, 35, "Project mapping list should expose Trello mappings");
assert.ok(mappings[0].fieldMapping.mapping.workItem, "Mapping should include provider-specific work-item object name");
const planner = seedIntegrations.find(item => item.provider === "Microsoft Planner");
const plannerSync = integrations.syncIntegration(planner.id, {}, "USER-INTEGRATION");
assert.strictEqual(plannerSync.syncRun.createdCount, 35, "Planner sync should create one mapping per seed risk");
assert.ok(plannerSync.mappings.every(item => item.externalItemType === "Task"), "Planner risks should map to Planner tasks");
assert.ok(plannerSync.mappings[0].fieldMapping.mapping.project === "Plan", "Planner project mapping should use Plan");
const syncRuns = integrations.listSyncRuns(projectId);
assert.ok(syncRuns.length >= 2, "Sync history should record sync runs");
assert.ok(syncRuns[0].provider === "Microsoft Planner", "Latest sync run should identify the provider");
const dbAfter = database.read();
assert.ok(dbAfter.tables.audit_events.some(event => event.entity_type === "ProjectManagementSyncRun" && event.action === "sync"), "Sync should create audit event");
fs.unlinkSync(temp);
console.log("All COSMIC AI-Risk integration workflow tests passed.");