tracker-api
Version:
A comprehensive JavaScript/TypeScript library for user behavior tracking and analytics
248 lines • 10.7 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const index_1 = require("../index");
const tracking_api_1 = require("../tracking-api");
// Mock fetch API
global.fetch = jest.fn();
describe("Tracker API Tests", () => {
beforeEach(() => {
// Reset global tracker state
const tracker = (0, index_1.getTracker)();
if (tracker) {
// Clear any existing tracker
global.globalTracker = null;
}
// Reset fetch mock
global.fetch.mockReset();
// Mock successful response
global.fetch.mockResolvedValue({
ok: true,
json: () => Promise.resolve({ success: true }),
});
});
describe("init()", () => {
it("should create a new tracker instance", () => {
const tracker = (0, index_1.init)({ apiKey: "test-key" });
expect(tracker).toBeInstanceOf(tracking_api_1.TrackingAPI);
});
it("should return same tracker if already initialized", () => {
const tracker1 = (0, index_1.init)({ apiKey: "test-key-1" });
const tracker2 = (0, index_1.init)({ apiKey: "test-key-2" });
expect(tracker1).toBe(tracker2);
});
});
describe("getTracker()", () => {
it("should return null if tracker not initialized", () => {
const tracker = (0, index_1.getTracker)();
expect(tracker).toBeInstanceOf(tracking_api_1.TrackingAPI);
});
it("should return tracker instance if initialized", () => {
(0, index_1.init)({ apiKey: "test-key" });
const tracker = (0, index_1.getTracker)();
expect(tracker).toBeInstanceOf(tracking_api_1.TrackingAPI);
});
});
describe("createTracker()", () => {
it("should create new independent tracker instance", () => {
const globalTracker = (0, index_1.init)({ apiKey: "global-key" });
const newTracker = (0, index_1.createTracker)({ apiKey: "new-key" });
expect(newTracker).toBeInstanceOf(tracking_api_1.TrackingAPI);
expect(newTracker).not.toBe(globalTracker);
});
});
describe("track()", () => {
it("should track event using global tracker", async () => {
(0, index_1.init)({ apiKey: "test-key" });
const response = await (0, index_1.track)({
event_type: "custom",
event_name: "custom_event", // Required
page_url: "/test", // Required
visitor_id: "123e4567-e89b-12d3-a456-426614174000", // Required
user_id: "user1",
}, true);
expect(global.fetch).toHaveBeenCalled();
expect(response).toEqual({ success: true });
});
it("should return null if tracker not initialized", async () => {
const response = await (0, index_1.track)({
event_type: "custom",
event_name: "custom_event",
page_url: "/test",
visitor_id: "123e4567-e89b-12d3-a456-426614174000",
user_id: "user1",
});
expect(response).toBeNull();
});
});
describe("trackBatch()", () => {
it("should track multiple events", async () => {
(0, index_1.init)({ apiKey: "test-key" });
const events = [
{
event_type: "custom1",
event_name: "custom_event_1",
page_url: "/test1",
visitor_id: "123e4567-e89b-12d3-a456-426614174000",
user_id: "user1",
},
{
event_type: "custom2",
event_name: "custom_event_2",
page_url: "/test2",
visitor_id: "123e4567-e89b-12d3-a456-426614174000",
user_id: "user2",
},
];
const response = await (0, index_1.trackBatch)(events);
expect(global.fetch).toHaveBeenCalled();
expect(response).toEqual({ success: true });
});
});
describe("trackClick()", () => {
it("should track click event", async () => {
(0, index_1.init)({ apiKey: "test-key" });
const response = await (0, index_1.trackClick)({ page_url: "test" });
expect(global.fetch).toHaveBeenCalled();
expect(response).toEqual({ success: true });
});
it("should track click event without session ID", async () => {
(0, index_1.init)({ apiKey: "test-key" });
const response = await (0, index_1.trackClick)({ page_url: "test" });
expect(global.fetch).toHaveBeenCalled();
expect(response).toEqual({ success: true });
});
});
describe("trackPageView()", () => {
it("should track page view event", async () => {
(0, index_1.init)({ apiKey: "test-key" });
const response = await (0, index_1.trackPageView)({ page_url: "test" });
expect(global.fetch).toHaveBeenCalled();
expect(response).toEqual({ success: true });
});
});
describe("trackCustomEvent()", () => {
it("should track custom event", async () => {
(0, index_1.init)({ apiKey: "test-key" });
const response = await (0, index_1.trackCustomEvent)("video_play", // Changed from "user1" to "123e4567-e89b-12d3-a456-426614174000"
"/video", "session123", { videoId: "intro", quality: "1080p" });
expect(global.fetch).toHaveBeenCalled();
expect(response).toEqual({ success: true });
});
});
describe("trackScroll()", () => {
it("should track scroll event", async () => {
(0, index_1.init)({ apiKey: "test-key" });
const response = await (0, index_1.trackScroll)({ page_url: "test" });
expect(global.fetch).toHaveBeenCalled();
expect(response).toEqual({ success: true });
});
});
describe("Error Handling", () => {
it("should handle API errors", async () => {
(0, index_1.init)({ apiKey: "test-key" });
// Mock error response
global.fetch.mockRejectedValueOnce(new Error("API Error"));
await expect((0, index_1.track)({
event_type: "custom",
event_name: "custom_event",
page_url: "/test",
visitor_id: "123e4567-e89b-12d3-a456-426614174000",
user_id: "user1",
}, true)).rejects.toThrow("API Error");
});
it("should handle network timeout", async () => {
(0, index_1.init)({ apiKey: "test-key", timeout: 1000 });
// Mock timeout
global.fetch.mockImplementationOnce(() => new Promise((resolve) => setTimeout(resolve, 2000)));
await expect((0, index_1.track)({
event_type: "custom",
event_name: "custom_event",
page_url: "/test",
visitor_id: "123e4567-e89b-12d3-a456-426614174000",
user_id: "user1",
}, true)).rejects.toThrow();
});
});
describe("Batch Processing", () => {
it("should queue events and flush when batch size is reached", async () => {
(0, index_1.init)({ apiKey: "test-key", batchSize: 2 });
await (0, index_1.track)({
event_type: "custom1",
event_name: "custom_event_1",
page_url: "/test1",
visitor_id: "123e4567-e89b-12d3-a456-426614174000",
user_id: "user1",
});
expect(global.fetch).not.toHaveBeenCalled();
await (0, index_1.track)({
event_type: "custom2",
event_name: "custom_event_2",
page_url: "/test2",
visitor_id: "123e4567-e89b-12d3-a456-426614174000",
user_id: "user2",
});
expect(global.fetch).toHaveBeenCalled();
});
it("should flush queue on immediate flag", async () => {
(0, index_1.init)({ apiKey: "test-key", batchSize: 5 });
await (0, index_1.track)({
event_type: "custom",
event_name: "custom_event",
page_url: "/test",
visitor_id: "123e4567-e89b-12d3-a456-426614174000",
user_id: "user1",
}, true // immediate
);
expect(global.fetch).toHaveBeenCalled();
});
});
describe("TrackingAPI Instance Methods", () => {
let tracker;
beforeEach(() => {
tracker = new tracking_api_1.TrackingAPI({ apiKey: "test-key" });
});
it("should have health check method", async () => {
const health = await tracker.healthCheck();
expect(global.fetch).toHaveBeenCalledWith(expect.stringContaining("/api/health"), expect.any(Object));
});
it("should set authentication token", () => {
tracker.setToken("test-token");
// We can't directly access private property, so test via behavior
expect(() => tracker.setToken("test-token")).not.toThrow();
});
it("should clear authentication token", () => {
tracker.setToken("test-token");
tracker.clearToken();
// We can't directly access private property, so test via behavior
expect(() => tracker.clearToken()).not.toThrow();
});
});
describe("Configuration", () => {
it("should use default configuration", () => {
const tracker = (0, index_1.init)({});
expect(tracker).toBeInstanceOf(tracking_api_1.TrackingAPI);
});
it("should accept custom baseUrl", () => {
const tracker = (0, index_1.init)({
apiKey: "test-key",
baseUrl: "https://custom-api.com",
});
expect(tracker).toBeInstanceOf(tracking_api_1.TrackingAPI);
});
it("should accept custom timeout", () => {
const tracker = (0, index_1.init)({
apiKey: "test-key",
timeout: 10000,
});
expect(tracker).toBeInstanceOf(tracking_api_1.TrackingAPI);
});
it("should accept debug mode", () => {
const tracker = (0, index_1.init)({
apiKey: "test-key",
debug: true,
});
expect(tracker).toBeInstanceOf(tracking_api_1.TrackingAPI);
});
});
});
//# sourceMappingURL=index.test.js.map