Skip to content

Commit

Permalink
clear session on close
Browse files Browse the repository at this point in the history
  • Loading branch information
Yen Truong committed Jul 3, 2024
1 parent 7e00686 commit b710c93
Show file tree
Hide file tree
Showing 5 changed files with 70 additions and 46 deletions.
2 changes: 1 addition & 1 deletion package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion packages/chat-core-aws-connect/jest.config.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"collectCoverage": true,
"collectCoverageFrom": ["src/**", "!src/models/**/*.ts"],
"verbose": true,
"moduleFileExtensions": ["js", "ts"],
"moduleFileExtensions": ["js", "ts", "d.ts"],
"moduleDirectories": ["node_modules", "<rootDir>"],
"testEnvironment": "jsdom",
"testPathIgnorePatterns": ["./tests/mocks/*", "./tests/jest-setup.js"],
Expand Down
2 changes: 1 addition & 1 deletion packages/chat-core-aws-connect/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@yext/chat-core-aws-connect",
"version": "0.1.0-alpha",
"version": "0.1.0-alpha.2",
"description": "Typescript Networking Library for the Yext Chat API Integration with Amazon Connect",
"main": "./dist/commonjs/index.js",
"module": "./dist/esm/index.mjs",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ export class ChatCoreAwsConnectImpl implements ChatCoreAwsConnect {
this.setupEventListeners();
this.session.sendMessage({
contentType: "text/plain",
message: messageRsp.notes.conversationSummary,
message: `SUMMARY: ${messageRsp.notes.conversationSummary}`,
});
}

Expand Down Expand Up @@ -96,6 +96,8 @@ export class ChatCoreAwsConnectImpl implements ChatCoreAwsConnect {

this.session?.onEnded((event: AwsConnectEvent) => {
this.eventListeners["close"]?.forEach((cb) => cb(event.data));
// Connection is closed. Clear session and create new one on next handoff request.
this.session = undefined;
});
}

Expand Down
106 changes: 64 additions & 42 deletions packages/chat-core-aws-connect/tests/ChatCoreAwsConnect.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import {
AwsConnectEventData,
} from "../src/models/AwsConnectEvent";
import "amazon-connect-chatjs";
import "../src/models/connect";

const createSpy = jest.fn().mockReturnValue(mockChatSession());
const globalConfigSpy = jest.fn();
Expand Down Expand Up @@ -77,33 +78,59 @@ function mockMessageResponse(): MessageResponse {
};
}

it("returns an error when failing to connect to chat session", async () => {
sess.connect = () => {
return { connectCalled: true, connectSuccess: false };
};
describe("chat session initialization", () => {
it("returns an error when failing to connect to chat session", async () => {
sess.connect = () => {
return { connectCalled: true, connectSuccess: false };
};

const chatCoreAwsConnect = provideChatCoreAwsConnect();
await expect(
chatCoreAwsConnect.init(mockMessageResponse())
).rejects.toThrowError("Failed to connect to chat session");
});
const chatCoreAwsConnect = provideChatCoreAwsConnect();
await expect(
chatCoreAwsConnect.init(mockMessageResponse())
).rejects.toThrowError("Failed to connect to chat session");
});

it("returns no error when successfully connecting to chat session", async () => {
const chatCoreAwsConnect = provideChatCoreAwsConnect();
await expect(
chatCoreAwsConnect.init(mockMessageResponse())
).resolves.toBeUndefined();
});
it("returns no error when successfully connecting to chat session", async () => {
const chatCoreAwsConnect = provideChatCoreAwsConnect();
await expect(
chatCoreAwsConnect.init(mockMessageResponse())
).resolves.toBeUndefined();
});

it("sends conversation summary message on chat session initialization", async () => {
const sendMessageSpy = jest.spyOn(sess, "sendMessage");
it("returns error when integration credentials are not specified", async () => {
const messageResponse = mockMessageResponse();
delete messageResponse.integrationDetails;

const chatCoreAwsConnect = provideChatCoreAwsConnect();
await chatCoreAwsConnect.init(mockMessageResponse());
const chatCoreAwsConnect = provideChatCoreAwsConnect();
await expect(chatCoreAwsConnect.init(messageResponse)).rejects.toThrowError(
"Integration credentials not specified. Cannot initialize chat session."
);
});

expect(sendMessageSpy).toBeCalledWith({
contentType: "text/plain",
message: "conversationSummary",
it("logs warning when session already exists", async () => {
const consoleWarnSpy = jest.spyOn(console, "warn").mockImplementation();
const sendMessageSpy = jest.spyOn(sess, "sendMessage");

const chatCoreAwsConnect = provideChatCoreAwsConnect();
await chatCoreAwsConnect.init(mockMessageResponse());
expect(consoleWarnSpy).not.toBeCalled();
expect(sendMessageSpy).toBeCalledTimes(1);

await chatCoreAwsConnect.init(mockMessageResponse());
expect(consoleWarnSpy).toBeCalledWith("Chat session already initialized");
expect(sendMessageSpy).toBeCalledTimes(1);
});

it("sends conversation summary message on chat session initialization", async () => {
const sendMessageSpy = jest.spyOn(sess, "sendMessage");

const chatCoreAwsConnect = provideChatCoreAwsConnect();
await chatCoreAwsConnect.init(mockMessageResponse());

expect(sendMessageSpy).toBeCalledWith({
contentType: "text/plain",
message: "SUMMARY: conversationSummary",
});
});
});

Expand Down Expand Up @@ -147,26 +174,6 @@ it("sends message on processMessage", async () => {
});
});

it("logs warning when session already exists", async () => {
const consoleWarnSpy = jest.spyOn(console, "warn");

const chatCoreAwsConnect = provideChatCoreAwsConnect();
await chatCoreAwsConnect.init(mockMessageResponse());
await chatCoreAwsConnect.init(mockMessageResponse());

expect(consoleWarnSpy).toBeCalledWith("Chat session already initialized");
});

it("returns error when integration credentials are not specified", async () => {
const messageResponse = mockMessageResponse();
delete messageResponse.integrationDetails;

const chatCoreAwsConnect = provideChatCoreAwsConnect();
await expect(chatCoreAwsConnect.init(messageResponse)).rejects.toThrowError(
"Integration credentials not specified. Cannot initialize chat session."
);
});

it("returns session on getSession", async () => {
const chatCoreAwsConnect = provideChatCoreAwsConnect();
await chatCoreAwsConnect.init(mockMessageResponse());
Expand Down Expand Up @@ -347,3 +354,18 @@ it("ignores messages with non-text content type", async () => {

expect(dummyFn).not.toBeCalled();
});

it("clear session on close event", async () => {
const onEndedSpy = jest.spyOn(sess, "onEnded");

const chatCoreAwsConnect = provideChatCoreAwsConnect();
await chatCoreAwsConnect.init(mockMessageResponse());
expect(chatCoreAwsConnect.getSession()).toBeDefined();

// get the parameter passed to the onSpy callback
const onEndedFn = onEndedSpy.mock.calls[0][0] as AwsEventCallback;

// simulate a session close event
onEndedFn({});
expect(chatCoreAwsConnect.getSession()).toBeUndefined();
});

0 comments on commit b710c93

Please sign in to comment.