countly-sdk-web
Version:
Countly Web SDK
217 lines (179 loc) • 7.92 kB
JavaScript
/* eslint-disable require-jsdoc */
var Countly = require("../../lib/countly");
var hp = require("../support/helper");
/**
* Tests for the fake_request_handler feature
* This allows injecting a mock server in tests for controlled request/response handling
*/
describe("Fake request handler", () => {
it("captures requests and provides custom responses via init config", () => {
hp.haltAndClearStorage(() => {
var capturedRequests = [];
Countly.init({
app_key: hp.appKey,
url: "https://test.count.ly",
debug: true,
fake_request_handler: function(req) {
capturedRequests.push(req);
// Return success response
return { status: 200, responseText: '{"result":"Success"}' };
}
});
Countly.add_event({ key: "test_event", count: 1 });
Countly.begin_session();
cy.wait(500).then(() => {
// Verify requests were captured
expect(capturedRequests.length).to.be.greaterThan(0);
// Check that we have different request types
var functionNames = capturedRequests.map(r => r.functionName);
expect(functionNames).to.include("send_request_queue");
// Verify request structure
var hasBeginSession = capturedRequests.some(r =>
r.params && r.params.begin_session === 1
);
expect(hasBeginSession).to.be.true;
});
});
});
it("allows simulating error responses", () => {
hp.haltAndClearStorage(() => {
var requestCount = 0;
Countly.init({
app_key: hp.appKey,
url: "https://test.count.ly",
debug: true,
fake_request_handler: function() {
requestCount++;
// Simulate server error
return { status: 500, responseText: 'Internal Server Error' };
}
});
Countly.begin_session();
cy.wait(300).then(() => {
// Requests should still be captured even on error
expect(requestCount).to.be.greaterThan(0);
});
});
});
it("can be set at runtime via _internals", () => {
hp.haltAndClearStorage(() => {
var capturedRequests = [];
Countly.init({
app_key: hp.appKey,
url: "https://test.count.ly",
debug: true,
test_mode: true // prevent queue processing initially
});
// Set handler at runtime
Countly._internals.setFakeRequestHandler(function(req) {
capturedRequests.push(req);
return { status: 200, responseText: '{"result":"Success"}' };
});
// Verify it was set
var handler = Countly._internals.getFakeRequestHandler();
expect(handler).to.be.a("function");
// Enable request processing
Countly.test_mode_rq(false);
Countly.add_event({ key: "runtime_event", count: 1 });
cy.wait(500).then(() => {
expect(capturedRequests.length).to.be.greaterThan(0);
});
});
});
it("returns default success when handler returns undefined", () => {
hp.haltAndClearStorage(() => {
Countly.init({
app_key: hp.appKey,
url: "https://test.count.ly",
debug: true,
fake_request_handler: function() {
// Return nothing - should default to success
return undefined;
}
});
Countly.begin_session();
cy.wait(300).then(() => {
// Session should start successfully with default response
expect(Countly._internals.testingGetRequests().length).to.be.greaterThan(0);
});
});
});
it("skips callback when handler returns false", () => {
hp.haltAndClearStorage(() => {
var capturedRequests = [];
Countly.init({
app_key: hp.appKey,
url: "https://test.count.ly",
debug: true,
fake_request_handler: function(req) {
capturedRequests.push(req);
// Return false to skip callback entirely
return false;
}
});
Countly.begin_session();
cy.wait(300).then(() => {
// Requests should still be captured
expect(capturedRequests.length).to.be.greaterThan(0);
});
});
});
it("works with helper createFakeRequestHandler utility", () => {
hp.haltAndClearStorage(() => {
// Use the helper utility for cleaner test setup
var fakeServer = hp.createFakeRequestHandler({
onRequest: function(req) {
// Custom logic per request
if (req.params && req.params.begin_session) {
return { status: 200, responseText: '{"result":"Session started"}' };
}
return { status: 200, responseText: '{"result":"OK"}' };
}
});
Countly.init({
app_key: hp.appKey,
url: "https://test.count.ly",
debug: true,
fake_request_handler: fakeServer.handler
});
Countly.begin_session();
Countly.add_event({ key: "helper_event", count: 1 });
cy.wait(500).then(() => {
// Use helper methods for easy querying
var sessionReqs = fakeServer.findByParam("begin_session", 1);
expect(sessionReqs.length).to.equal(1);
var allReqs = fakeServer.getRequests();
expect(allReqs.length).to.be.greaterThan(0);
// Clear for next test section
fakeServer.clear();
expect(fakeServer.getRequests().length).to.equal(0);
});
});
});
it("provides full request details for validation", () => {
hp.haltAndClearStorage(() => {
var lastRequest = null;
Countly.init({
app_key: hp.appKey,
url: "https://test.count.ly",
debug: true,
fake_request_handler: function(req) {
lastRequest = req;
return { status: 200, responseText: '{"result":"Success"}' };
}
});
Countly.begin_session();
cy.wait(300).then(() => {
expect(lastRequest).to.not.be.null;
// Verify request structure has all expected fields
expect(lastRequest).to.have.property("functionName");
expect(lastRequest).to.have.property("url");
expect(lastRequest).to.have.property("params");
// URL should match configured server
expect(lastRequest.url).to.include("test.count.ly");
// Params should have app_key
expect(lastRequest.params).to.have.property("app_key", hp.appKey);
});
});
});
});