Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
120 changes: 120 additions & 0 deletions __tests__/it/integration_test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -554,4 +554,124 @@ describe('Integration Tests', () => {
expect(error).toBeDefined();
}
}, 60000);

test('session operations', async () => {
// Deploy function with sessionAffinity enabled (required for session operations)
const deployInputs = _.cloneDeep(inputs);
deployInputs.props.sessionAffinity = 'GENERATED_COOKIE';
await myFcInstance.deploy(deployInputs);

// Test create session
const createInputs = _.cloneDeep(inputs);
createInputs.command = 'session';
createInputs.args = ['create', '--qualifier', 'LATEST', '--st', '3600', '--si', '1800'];
const createOutput = await myFcInstance.session(createInputs);
expect(createOutput).toBeDefined();
expect(createOutput.sessionId).toBeDefined();
const sessionId = createOutput.sessionId;

// Test get session
const getInputs = _.cloneDeep(inputs);
getInputs.command = 'session';
getInputs.args = ['get', '--session-id', sessionId, '--qualifier', 'LATEST'];
const getOutput = await myFcInstance.session(getInputs);
expect(getOutput).toBeDefined();
expect(getOutput.sessionId).toBe(sessionId);

// Test list sessions
const listInputs = _.cloneDeep(inputs);
listInputs.command = 'session';
listInputs.args = ['list', '--qualifier', 'LATEST'];
const listOutput = await myFcInstance.session(listInputs);
expect(listOutput).toBeDefined();
expect(Array.isArray(listOutput)).toBe(true);

// Test update session
const updateInputs = _.cloneDeep(inputs);
updateInputs.command = 'session';
updateInputs.args = [
'update',
'--session-id',
sessionId,
'--qualifier',
'LATEST',
'--st',
'7200',
'--si',
'3600',
];
const updateOutput = await myFcInstance.session(updateInputs);
expect(updateOutput).toBeDefined();

// Test remove session (DELETE operation may return undefined)
const removeSessionInputs = _.cloneDeep(inputs);
removeSessionInputs.command = 'session';
removeSessionInputs.args = ['remove', '--session-id', sessionId, '--qualifier', 'LATEST', '-y'];
await myFcInstance.session(removeSessionInputs);

// Clean up: remove the function
const removeInputs = _.cloneDeep(inputs);
removeInputs.command = 'remove';
removeInputs.args = ['--function', '--assume-yes'];
try {
await myFcInstance.remove(removeInputs);
} catch (error) {
// Ignore cleanup errors
}
}, 120000);
Comment on lines +558 to +621
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Ensure cleanup always runs in session operations.

If any assertion/API call fails before the cleanup block, the session/function cleanup is skipped. That can leak test resources and destabilize later integration runs.

Suggested fix
   test('session operations', async () => {
-    // Deploy function with sessionAffinity enabled (required for session operations)
-    const deployInputs = _.cloneDeep(inputs);
-    deployInputs.props.sessionAffinity = 'GENERATED_COOKIE';
-    await myFcInstance.deploy(deployInputs);
-
-    // Test create session
-    const createInputs = _.cloneDeep(inputs);
-    createInputs.command = 'session';
-    createInputs.args = ['create', '--qualifier', 'LATEST', '--st', '3600', '--si', '1800'];
-    const createOutput = await myFcInstance.session(createInputs);
-    expect(createOutput).toBeDefined();
-    expect(createOutput.sessionId).toBeDefined();
-    const sessionId = createOutput.sessionId;
-
-    // ... get/list/update/remove ...
-
-    // Clean up: remove the function
-    const removeInputs = _.cloneDeep(inputs);
-    removeInputs.command = 'remove';
-    removeInputs.args = ['--function', '--assume-yes'];
-    try {
-      await myFcInstance.remove(removeInputs);
-    } catch (error) {
-      // Ignore cleanup errors
-    }
+    let sessionId: string | undefined;
+    try {
+      const deployInputs = _.cloneDeep(inputs);
+      deployInputs.props.sessionAffinity = 'GENERATED_COOKIE';
+      await myFcInstance.deploy(deployInputs);
+
+      const createInputs = _.cloneDeep(inputs);
+      createInputs.command = 'session';
+      createInputs.args = ['create', '--qualifier', 'LATEST', '--st', '3600', '--si', '1800'];
+      const createOutput = await myFcInstance.session(createInputs);
+      expect(createOutput.sessionId).toBeDefined();
+      sessionId = createOutput.sessionId;
+
+      // ... get/list/update ...
+    } finally {
+      if (sessionId) {
+        const removeSessionInputs = _.cloneDeep(inputs);
+        removeSessionInputs.command = 'session';
+        removeSessionInputs.args = ['remove', '--session-id', sessionId, '--qualifier', 'LATEST', '-y'];
+        await myFcInstance.session(removeSessionInputs).catch(() => undefined);
+      }
+
+      const removeInputs = _.cloneDeep(inputs);
+      removeInputs.command = 'remove';
+      removeInputs.args = ['--function', '--assume-yes'];
+      await myFcInstance.remove(removeInputs).catch(() => undefined);
+    }
   }, 120000);
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@__tests__/it/integration_test.ts` around lines 558 - 621, The test "session
operations" can skip cleanup if an assertion or API call throws; wrap the test
body so session and function cleanup always run (use try/finally): capture
sessionId from myFcInstance.session(createInputs) if created, then in a finally
block attempt to remove the session via
myFcInstance.session(removeSessionInputs) only if sessionId is set, and always
attempt to remove the function via myFcInstance.remove(removeInputs), swallowing
errors there as needed; ensure you reference the existing variables and methods
(sessionId, myFcInstance.session, myFcInstance.remove, and the
removeInputs/removeSessionInputs) when implementing the finally-based cleanup.


test('session pause and resume', async () => {
// Deploy function with sessionAffinity enabled (required for session operations)
const deployInputs = _.cloneDeep(inputs);
deployInputs.props.sessionAffinity = 'GENERATED_COOKIE';
await myFcInstance.deploy(deployInputs);

// Create a session first
const createInputs = _.cloneDeep(inputs);
createInputs.command = 'session';
createInputs.args = ['create', '--qualifier', 'LATEST', '--st', '3600', '--si', '1800'];
const createOutput = await myFcInstance.session(createInputs);
expect(createOutput).toBeDefined();
const sessionId = createOutput.sessionId;

try {
// Test pause - may fail if function is not SESSION_EXCLUSIVE with custom-container runtime
const pauseInputs = _.cloneDeep(inputs);
pauseInputs.command = 'session';
pauseInputs.args = ['pause', '--session-id', sessionId, '--qualifier', 'LATEST'];
const pauseOutput = await myFcInstance.session(pauseInputs);
expect(pauseOutput).toBeDefined();

// If pause succeeded, test resume
const resumeInputs = _.cloneDeep(inputs);
resumeInputs.command = 'session';
resumeInputs.args = ['resume', '--session-id', sessionId, '--qualifier', 'LATEST'];
const resumeOutput = await myFcInstance.session(resumeInputs);
expect(resumeOutput).toBeDefined();
} catch (error) {
// Pause/resume requires SESSION_EXCLUSIVE + custom-container + healthCheck
// This is expected to fail on a basic python3.9 function
expect(error).toBeDefined();
}

// Clean up: remove the session
const removeSessionInputs = _.cloneDeep(inputs);
removeSessionInputs.command = 'session';
removeSessionInputs.args = ['remove', '--session-id', sessionId, '--qualifier', 'LATEST', '-y'];
try {
await myFcInstance.session(removeSessionInputs);
} catch (error) {
// Ignore cleanup errors
}

// Clean up: remove the function
const removeInputs = _.cloneDeep(inputs);
removeInputs.command = 'remove';
removeInputs.args = ['--function', '--assume-yes'];
try {
await myFcInstance.remove(removeInputs);
} catch (error) {
// Ignore cleanup errors
}
}, 120000);
});
Loading
Loading