From 6f9624b5fb04ae5aa8541d513c32574f9c051202 Mon Sep 17 00:00:00 2001
From: Aleksander Nicacio da Silva <aleksander.silva@rocket.chat>
Date: Fri, 15 Mar 2024 11:16:56 -0300
Subject: [PATCH] regression: triggers being scheduled when user is already
 registered (#31999)

Co-authored-by: Guilherme Gazzo <guilhermegazzo@gmail.com>
---
 ...nichannel-triggers-open-by-visitor.spec.ts | 100 ++++++++++++++++++
 .../omnichannel-triggers-time-on-site.spec.ts |  99 +++++++++++++++++
 .../e2e/page-objects/omnichannel-livechat.ts  |   2 +-
 packages/livechat/src/lib/triggers.js         |   8 +-
 4 files changed, 207 insertions(+), 2 deletions(-)
 create mode 100644 apps/meteor/tests/e2e/omnichannel/omnichannel-triggers-open-by-visitor.spec.ts
 create mode 100644 apps/meteor/tests/e2e/omnichannel/omnichannel-triggers-time-on-site.spec.ts

diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-triggers-open-by-visitor.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-triggers-open-by-visitor.spec.ts
new file mode 100644
index 00000000000..a61508599e8
--- /dev/null
+++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-triggers-open-by-visitor.spec.ts
@@ -0,0 +1,100 @@
+import { faker } from '@faker-js/faker';
+import type { Page } from '@playwright/test';
+
+import { createAuxContext } from '../fixtures/createAuxContext';
+import { Users } from '../fixtures/userStates';
+import { OmnichannelLiveChat, HomeOmnichannel } from '../page-objects';
+import { test, expect } from '../utils/test';
+
+test.use({ storageState: Users.admin.state });
+test.describe('OC - Livechat Triggers - Open by Visitor', () => {
+	let poLiveChat: OmnichannelLiveChat;
+	let newUser: { email: string; name: string };
+	let agent: { page: Page; poHomeOmnichannel: HomeOmnichannel };
+
+	test.beforeAll(async ({ api, browser }) => {
+		newUser = {
+			name: faker.person.firstName(),
+			email: faker.internet.email(),
+		};
+
+		const requests = await Promise.all([
+			api.post('/livechat/users/agent', { username: 'user1' }),
+			api.post('/livechat/users/manager', { username: 'user1' }),
+			api.post(
+				'/livechat/triggers',
+
+				{
+					name: 'open',
+					description: '',
+					enabled: true,
+					runOnce: false,
+					conditions: [
+						{
+							name: 'chat-opened-by-visitor',
+							value: '',
+						},
+					],
+					actions: [
+						{
+							name: 'send-message',
+							params: {
+								name: '',
+								msg: 'This is a trigger message open by visitor',
+								sender: 'queue',
+							},
+						},
+					],
+				},
+			),
+		]);
+
+		requests.every((e) => expect(e.status()).toBe(200));
+
+		const { page } = await createAuxContext(browser, Users.user1, '/');
+		agent = { page, poHomeOmnichannel: new HomeOmnichannel(page) };
+	});
+
+	test.beforeEach(async ({ page, api }) => {
+		poLiveChat = new OmnichannelLiveChat(page, api);
+		await page.goto('/livechat');
+	});
+
+	test.afterAll(async ({ api }) => {
+		const ids = (await (await api.get('/livechat/triggers')).json()).triggers.map(
+			(trigger: { _id: string }) => trigger._id,
+		) as unknown as string[];
+
+		await Promise.all(ids.map((id) => api.delete(`/livechat/triggers/${id}`)));
+
+		await Promise.all([
+			api.delete('/livechat/users/agent/user1'),
+			api.delete('/livechat/users/manager/user1'),
+			api.post('/settings/Livechat_clear_local_storage_when_chat_ended', { value: false }),
+		]);
+		await agent.page.close();
+	});
+
+	test('OC - Livechat Triggers - after the visitor opens the chat the trigger message should not be visible neither after a page reload', async () => {
+		await poLiveChat.openLiveChat();
+
+		await expect(poLiveChat.txtChatMessage('This is a trigger message open by visitor')).toBeVisible();
+
+		await poLiveChat.btnChatNow.click();
+		await poLiveChat.sendMessage(newUser, false);
+
+		await poLiveChat.onlineAgentMessage.type('this_a_test_message_from_visitor');
+		await poLiveChat.btnSendMessageToOnlineAgent.click();
+
+		await expect(poLiveChat.txtChatMessage('this_a_test_message_from_visitor')).toBeVisible();
+
+		await poLiveChat.page.reload();
+
+		// if the request took too long, the loadMessage cleans triggers, but if the fetch is fast enough, the trigger message will be visible
+		await poLiveChat.page.waitForRequest(/livechat\/messages.history/);
+
+		await poLiveChat.openLiveChat();
+		await expect(poLiveChat.txtChatMessage('This is a trigger message open by visitor')).not.toBeVisible();
+		await expect(poLiveChat.txtChatMessage('this_a_test_message_from_visitor')).toBeVisible();
+	});
+});
diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-triggers-time-on-site.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-triggers-time-on-site.spec.ts
new file mode 100644
index 00000000000..f52e1ca1370
--- /dev/null
+++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-triggers-time-on-site.spec.ts
@@ -0,0 +1,99 @@
+import { faker } from '@faker-js/faker';
+import type { Page } from '@playwright/test';
+
+import { createAuxContext } from '../fixtures/createAuxContext';
+import { Users } from '../fixtures/userStates';
+import { OmnichannelLiveChat, HomeOmnichannel } from '../page-objects';
+import { test, expect } from '../utils/test';
+
+test.use({ storageState: Users.admin.state });
+test.describe('OC - Livechat Triggers - Time on site', () => {
+	let poLiveChat: OmnichannelLiveChat;
+	let newUser: { email: string; name: string };
+	let agent: { page: Page; poHomeOmnichannel: HomeOmnichannel };
+
+	test.beforeAll(async ({ api, browser }) => {
+		newUser = {
+			name: faker.person.firstName(),
+			email: faker.internet.email(),
+		};
+
+		const requests = await Promise.all([
+			api.post('/livechat/users/agent', { username: 'user1' }),
+			api.post('/livechat/users/manager', { username: 'user1' }),
+			api.post(
+				'/livechat/triggers',
+
+				{
+					enabled: true,
+					runOnce: false,
+					conditions: [{ name: 'time-on-site', value: '1' }],
+					actions: [{ name: 'send-message', params: { name: '', msg: 'This is a trigger message time on site', sender: 'queue' } }],
+					name: 'test',
+					description: 'test',
+				},
+			),
+		]);
+
+		requests.every((e) => expect(e.status()).toBe(200));
+
+		const { page } = await createAuxContext(browser, Users.user1, '/');
+		agent = { page, poHomeOmnichannel: new HomeOmnichannel(page) };
+	});
+
+	test.beforeEach(async ({ page, api }) => {
+		poLiveChat = new OmnichannelLiveChat(page, api);
+		await page.goto('/livechat');
+	});
+
+	test.afterAll(async ({ api }) => {
+		const ids = (await (await api.get('/livechat/triggers')).json()).triggers.map(
+			(trigger: { _id: string }) => trigger._id,
+		) as unknown as string[];
+
+		await Promise.all(ids.map((id) => api.delete(`/livechat/triggers/${id}`)));
+
+		await Promise.all([
+			api.delete('/livechat/users/agent/user1'),
+			api.delete('/livechat/users/manager/user1'),
+			api.post('/settings/Livechat_clear_local_storage_when_chat_ended', { value: false }),
+		]);
+		await agent.page.close();
+	});
+
+	test('expect to receive trigger message after 1 second', async () => {
+		await expect(poLiveChat.page.locator('role=button[name="Close"]')).toBeVisible();
+		await expect(poLiveChat.page.locator('role=main')).toContainText('This is a trigger message time on site');
+		await expect(poLiveChat.page.locator('role=button[name="Start chat"]')).toBeVisible();
+		await expect(poLiveChat.page.locator('role=button[name="Messages"]')).toBeVisible();
+	});
+
+	test('OC - Livechat Triggers - after the visitor opens the chat the trigger time-on-site should not be triggered after reload', async () => {
+		await expect(poLiveChat.page.locator('role=button[name="Close"]')).toBeVisible();
+		await expect(poLiveChat.page.locator('role=main')).toContainText('This is a trigger message time on site');
+		await expect(poLiveChat.page.locator('role=button[name="Start chat"]')).toBeVisible();
+		await expect(poLiveChat.page.locator('role=button[name="Messages"]')).toBeVisible();
+
+		await poLiveChat.btnOpenOnlineLiveChat('Start chat').click();
+		await poLiveChat.btnOpenOnlineLiveChat('Chat now').click();
+
+		await poLiveChat.sendMessage(newUser, false);
+
+		await test.step('expect to not have any trigger message after registration', async () => {
+			await expect(poLiveChat.txtChatMessage('This is a trigger message time on site')).not.toBeVisible();
+		});
+
+		await poLiveChat.onlineAgentMessage.type('this_a_test_message_from_visitor');
+		await poLiveChat.btnSendMessageToOnlineAgent.click();
+
+		await expect(poLiveChat.page.locator('role=main')).toContainText('Chat started');
+
+		await poLiveChat.page.reload();
+
+		await poLiveChat.btnOpenOnlineLiveChat('Rocket.Chat').click();
+
+		await expect(poLiveChat.page.locator('role=main')).toContainText('Chat started');
+		await poLiveChat.page.waitForTimeout(1000);
+		await expect(poLiveChat.txtChatMessage('This is a trigger message time on site')).not.toBeVisible();
+	});
+});
diff --git a/apps/meteor/tests/e2e/page-objects/omnichannel-livechat.ts b/apps/meteor/tests/e2e/page-objects/omnichannel-livechat.ts
index c7a7895a23a..8921d8e50df 100644
--- a/apps/meteor/tests/e2e/page-objects/omnichannel-livechat.ts
+++ b/apps/meteor/tests/e2e/page-objects/omnichannel-livechat.ts
@@ -50,7 +50,7 @@ export class OmnichannelLiveChat {
 	}
 
 	async openLiveChat(): Promise<void> {
-		const { value: siteName } = await (await this.api.get('/settings/Site_Name')).json();
+		const { value: siteName } = await (await this.api.get('/settings/Livechat_title')).json();
 		await this.btnOpenOnlineLiveChat(siteName).click();
 	}
 
diff --git a/packages/livechat/src/lib/triggers.js b/packages/livechat/src/lib/triggers.js
index 1e03e3ee252..54e70266476 100644
--- a/packages/livechat/src/lib/triggers.js
+++ b/packages/livechat/src/lib/triggers.js
@@ -68,8 +68,14 @@ class Triggers {
 	}
 
 	async when(id, condition) {
+		const { user } = store.state;
+
 		if (!this._enabled) {
-			return Promise.reject('Triggers disabled');
+			return Promise.reject('Failed to schedule. Triggers disabled.');
+		}
+
+		if (user) {
+			return Promise.reject('Failed to schedule. User already registered.');
 		}
 
 		this._updateRecord(id, {
-- 
GitLab