Testing

Mocking and unit testing examples

Mock Server for Testing

// Setup mock responses for testing
grab.mock.users = {
  response: [
    { id: 1, name: "John Doe", email: "john@example.com" },
    { id: 2, name: "Jane Smith", email: "jane@example.com" },
  ],
  delay: 1, // 1 second delay to simulate network
};

grab.mock["products/search"] = {
  response: (params) => ({
    results: [
      { id: 1, name: `Product matching "${params.query}"`, price: 29.99 },
      { id: 2, name: `Another product for "${params.query}"`, price: 19.99 },
    ],
    total: 2,
  }),
  post: true,
  delay: 0.5,
};

// Now your API calls will use mock data
const users = await grab("users"); // Returns mock user data

// Mock with conditional responses
grab.mock["auth/login"] = {
  response: (params) => {
    if (
      params.email === "admin@example.com" &&
      params.password === "admin123"
    ) {
      return {
        success: true,
        token: "mock-jwt-token-12345",
        user: { id: 1, name: "Admin User", role: "admin" },
      };
    } else {
      return {
        success: false,
        error: "Invalid credentials",
      };
    }
  },
  post: true,
  delay: 1,
};

// Error simulation
grab.mock["users/create"] = {
  response: (params) => {
    if (!params.email) {
      throw new Error("Email is required");
    }
    return { id: Date.now(), ...params, created: true };
  },
  post: true,
};

Unit Tests with Jest

// setup-tests.js
import grab from "grab-url";

// Setup global mocks for testing
beforeEach(() => {
  // Clear previous mocks
  grab.mock = {};
  grab.log = [];
});

// user.test.js
import grab from "grab-url";

describe("User API", () => {
  test("should fetch user data", async () => {
    // Setup mock
    grab.mock.users = {
      response: { id: 1, name: "Test User", email: "test@example.com" },
    };

    const result = await grab("users");

    expect(result.id).toBe(1);
    expect(result.name).toBe("Test User");
  });

  test("should handle user creation", async () => {
    grab.mock.users = {
      response: (params) => ({
        id: 123,
        ...params,
        created: true,
      }),
      post: true,
    };

    const newUser = await grab("users", {
      post: true,
      name: "John Doe",
      email: "john@example.com",
    });

    expect(newUser.name).toBe("John Doe");
    expect(newUser.created).toBe(true);
  });

  test("should handle errors", async () => {
    grab.mock.users = {
      response: () => {
        throw new Error("User not found");
      },
    };

    const result = await grab("users");
    expect(result.error).toBe("User not found");
  });
});

On this page