This commit is contained in:
javad committed 2026-09-10 11:34:19 +03:30
commit fa9d154db9
260 files changed
+17643

No files matched your search

+67
View File
@@ -0,0 +1,67 @@
import assert from 'node:assert/strict';
import test from 'node:test';
import {readFileSync} from 'node:fs';
const listeners={};
const input={value:'',addEventListener:(name,handler)=>{listeners[`input:${name}`]=handler},focus:()=>{}};
const closeButton={addEventListener:(name,handler)=>{listeners[`close:${name}`]=handler}};
const hint={hidden:true,setAttribute:()=>{},querySelector:()=>closeButton};
const form={dataset:{chatCoachKey:'test-ticket'},action:'/tickets/example/reply/',querySelector:()=>input};
const renderedMessages=[];
let appendedHint=null;
globalThis.document={
body:{append:node=>{appendedHint=node}},
querySelectorAll:selector=>selector==='form[data-chat-coach]'?[form]:renderedMessages,
querySelector:selector=>selector==='[data-conversation]'?{}:null,
createElement:()=>hint,
};
globalThis.location={origin:'http://testserver',pathname:'/tickets/example/'};
globalThis.MutationObserver=class{constructor(handler){listeners.mutation=handler}observe(){}};
globalThis.setTimeout=handler=>{listeners.autoDismiss=handler;return 1};
globalThis.clearTimeout=()=>{delete listeners.autoDismiss};
let now=1_000_000;
Date.now=()=>now;
await import('../../static/js/chat-coach.js');
test('mounts guidance directly on body so collapsed forms cannot hide it',()=>{
assert.equal(appendedHint,hint);
assert.match(hint.className,/chat-coach-floating/);
});
test('shows guidance when the last two messages are at most two minutes apart',()=>{
renderedMessages.push(
{dataset:{chatCoachAt:String((now-40_000)/1000)}},
{dataset:{chatCoachAt:String((now-10_000)/1000)}},
);
listeners.mutation();
assert.equal(hint.hidden,false);
});
test('hides guidance when the last two messages are more than two minutes apart',()=>{
renderedMessages.splice(0,renderedMessages.length,
{dataset:{chatCoachAt:String((now-200_000)/1000)}},
{dataset:{chatCoachAt:String((now-10_000)/1000)}},
);
listeners.mutation();
assert.equal(hint.hidden,true);
});
test('guidance is configured to disappear automatically after three seconds',()=>{
const script=readFileSync('static/js/chat-coach.js','utf8');
assert.match(script,/autoDismissMs=3000/);
assert.match(script,/setTimeout\(\(\)=>dismiss\(\),autoDismissMs\)/);
assert.equal(typeof listeners.autoDismiss,'function');
});
test('large close button dismisses the guidance for the current page',()=>{
renderedMessages.splice(0,renderedMessages.length,
{dataset:{chatCoachAt:String((now-30_000)/1000)}},
{dataset:{chatCoachAt:String((now-5_000)/1000)}},
);
listeners.mutation();
assert.equal(hint.hidden,false);
listeners['close:click']();
assert.equal(hint.hidden,true);
});