gecko-dev/browser/components/newtab/test/unit/content-src/lib/detect-user-session-start.test.js
Mark Banner d1d1eca18d Bug 1881816 - Rename Actions.sys.mjs to Actions.mjs. r=amy,omc-reviewers,aminomancer
This better reflects the file is being accessed from both content and system scopes.

Differential Revision: https://phabricator.services.mozilla.com/D203400
2024-03-19 17:01:37 +00:00

117 lines
3.5 KiB
JavaScript

import { actionCreators as ac, actionTypes as at } from "common/Actions.mjs";
import { DetectUserSessionStart } from "content-src/lib/detect-user-session-start";
describe("detectUserSessionStart", () => {
let store;
class PerfService {
getMostRecentAbsMarkStartByName() {
return 1234;
}
mark() {}
}
beforeEach(() => {
store = { dispatch: () => {} };
});
describe("#sendEventOrAddListener", () => {
it("should call ._sendEvent immediately if the document is visible", () => {
const mockDocument = { visibilityState: "visible" };
const instance = new DetectUserSessionStart(store, {
document: mockDocument,
});
sinon.stub(instance, "_sendEvent");
instance.sendEventOrAddListener();
assert.calledOnce(instance._sendEvent);
});
it("should add an event listener on visibility changes the document is not visible", () => {
const mockDocument = {
visibilityState: "hidden",
addEventListener: sinon.spy(),
};
const instance = new DetectUserSessionStart(store, {
document: mockDocument,
});
sinon.stub(instance, "_sendEvent");
instance.sendEventOrAddListener();
assert.notCalled(instance._sendEvent);
assert.calledWith(
mockDocument.addEventListener,
"visibilitychange",
instance._onVisibilityChange
);
});
});
describe("#_sendEvent", () => {
it("should dispatch an action with the SAVE_SESSION_PERF_DATA", () => {
const dispatch = sinon.spy(store, "dispatch");
const instance = new DetectUserSessionStart(store);
instance._sendEvent();
assert.calledWith(
dispatch,
ac.AlsoToMain({
type: at.SAVE_SESSION_PERF_DATA,
data: { visibility_event_rcvd_ts: sinon.match.number },
})
);
});
it("shouldn't send a message if getMostRecentAbsMarkStartByName throws", () => {
let perfService = new PerfService();
sinon.stub(perfService, "getMostRecentAbsMarkStartByName").throws();
const dispatch = sinon.spy(store, "dispatch");
const instance = new DetectUserSessionStart(store, { perfService });
instance._sendEvent();
assert.notCalled(dispatch);
});
it('should call perfService.mark("visibility_event_rcvd_ts")', () => {
let perfService = new PerfService();
sinon.stub(perfService, "mark");
const instance = new DetectUserSessionStart(store, { perfService });
instance._sendEvent();
assert.calledWith(perfService.mark, "visibility_event_rcvd_ts");
});
});
describe("_onVisibilityChange", () => {
it("should not send an event if visiblity is not visible", () => {
const instance = new DetectUserSessionStart(store, {
document: { visibilityState: "hidden" },
});
sinon.stub(instance, "_sendEvent");
instance._onVisibilityChange();
assert.notCalled(instance._sendEvent);
});
it("should send an event and remove the event listener if visibility is visible", () => {
const mockDocument = {
visibilityState: "visible",
removeEventListener: sinon.spy(),
};
const instance = new DetectUserSessionStart(store, {
document: mockDocument,
});
sinon.stub(instance, "_sendEvent");
instance._onVisibilityChange();
assert.calledOnce(instance._sendEvent);
assert.calledWith(
mockDocument.removeEventListener,
"visibilitychange",
instance._onVisibilityChange
);
});
});
});