UNPKG

@jungvonmatt/sb-migrate

Version:

CLI tool for managing Storyblok schema and content migrations

564 lines 23.8 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const vitest_1 = require("vitest"); const storyblok_js_client_1 = __importDefault(require("storyblok-js-client")); const api_1 = require("../../utils/api"); const config_1 = require("../../utils/config"); // Mock the config utilities vitest_1.vi.mock("../../utils/config", () => ({ loadConfig: vitest_1.vi.fn(), loadEnvConfig: vitest_1.vi.fn(), })); // Mock StoryblokClient const mockStoryblokClient = { get: vitest_1.vi.fn(), post: vitest_1.vi.fn(), put: vitest_1.vi.fn(), delete: vitest_1.vi.fn(), }; vitest_1.vi.mock("storyblok-js-client", () => ({ default: vitest_1.vi.fn().mockImplementation(() => mockStoryblokClient), })); // Mock getStoryblokClient vitest_1.vi.mock("../../utils/api", async () => { const actual = await vitest_1.vi.importActual("../../utils/api"); return { ...actual, getStoryblokClient: vitest_1.vi.fn().mockImplementation(async () => { const config = await (0, config_1.loadConfig)(); if (!config) { const envConfig = await (0, config_1.loadEnvConfig)(); if (!envConfig.oauthToken) { throw new Error("No Storyblok OAuth token found"); } return new storyblok_js_client_1.default({ oauthToken: envConfig.oauthToken }); } return new storyblok_js_client_1.default({ oauthToken: config.oauthToken }); }), setRequestsPerSecond: vitest_1.vi.fn(), api: { stories: { getAll: vitest_1.vi.fn(), get: vitest_1.vi.fn(), getBySlug: vitest_1.vi.fn(), create: vitest_1.vi.fn(), update: vitest_1.vi.fn(), delete: vitest_1.vi.fn(), }, componentGroups: { getAll: vitest_1.vi.fn(), get: vitest_1.vi.fn(), create: vitest_1.vi.fn(), update: vitest_1.vi.fn(), delete: vitest_1.vi.fn(), }, components: { getAll: vitest_1.vi.fn(), get: vitest_1.vi.fn(), create: vitest_1.vi.fn(), update: vitest_1.vi.fn(), delete: vitest_1.vi.fn(), }, spaces: { getSpaceOptions: vitest_1.vi.fn(), getSpaceLanguages: vitest_1.vi.fn(), }, datasources: { getAll: vitest_1.vi.fn(), get: vitest_1.vi.fn(), create: vitest_1.vi.fn(), update: vitest_1.vi.fn(), delete: vitest_1.vi.fn(), has: vitest_1.vi.fn(), }, }, }; }); (0, vitest_1.describe)("API Utilities", () => { (0, vitest_1.beforeEach)(() => { vitest_1.vi.clearAllMocks(); }); (0, vitest_1.describe)("getStoryblokClient", () => { (0, vitest_1.it)("should create client with config file token", async () => { // Arrange const mockConfig = { oauthToken: "test-token" }; config_1.loadConfig.mockResolvedValue(mockConfig); // Act const client = await (0, api_1.getStoryblokClient)(); // Assert (0, vitest_1.expect)(storyblok_js_client_1.default).toHaveBeenCalledWith({ oauthToken: "test-token", }); (0, vitest_1.expect)(client).toBe(mockStoryblokClient); }); (0, vitest_1.it)("should create client with env token if config file not found", async () => { // Arrange const mockEnvConfig = { oauthToken: "env-token" }; config_1.loadConfig.mockResolvedValue(null); config_1.loadEnvConfig.mockResolvedValue(mockEnvConfig); // Act const client = await (0, api_1.getStoryblokClient)(); // Assert (0, vitest_1.expect)(storyblok_js_client_1.default).toHaveBeenCalledWith({ oauthToken: "env-token", }); (0, vitest_1.expect)(client).toBe(mockStoryblokClient); }); (0, vitest_1.it)("should throw error if no token found", async () => { // Arrange config_1.loadConfig.mockResolvedValue(null); config_1.loadEnvConfig.mockResolvedValue({}); // Act & Assert await (0, vitest_1.expect)((0, api_1.getStoryblokClient)()).rejects.toThrow("No Storyblok OAuth token found"); }); }); (0, vitest_1.describe)("setRequestsPerSecond", () => { (0, vitest_1.it)("should set rate limit correctly", () => { // Act (0, api_1.setRequestsPerSecond)(5); // Assert (0, vitest_1.expect)(api_1.setRequestsPerSecond).toBeDefined(); }); (0, vitest_1.it)("should handle zero or negative values", () => { // Act & Assert (0, vitest_1.expect)(() => (0, api_1.setRequestsPerSecond)(0)).not.toThrow(); (0, vitest_1.expect)(() => (0, api_1.setRequestsPerSecond)(-1)).not.toThrow(); }); }); (0, vitest_1.describe)("pagedGet", () => { (0, vitest_1.it)("should handle single page response", async () => { // Arrange const mockResponse = { data: { stories: [{ id: 1 }, { id: 2 }], }, total: 2, }; api_1.api.stories.getAll.mockResolvedValue(mockResponse); // Act const result = await api_1.api.stories.getAll(); // Assert (0, vitest_1.expect)(result.data.stories).toHaveLength(2); }); (0, vitest_1.it)("should handle multiple pages", async () => { // Arrange const mockResponse = { data: { stories: [{ id: 1 }, { id: 2 }, { id: 3 }, { id: 4 }], }, total: 4, }; api_1.api.stories.getAll.mockResolvedValue(mockResponse); // Act const result = await api_1.api.stories.getAll(); // Assert (0, vitest_1.expect)(result.data.stories).toHaveLength(4); (0, vitest_1.expect)(result.data.stories).toEqual([ { id: 1 }, { id: 2 }, { id: 3 }, { id: 4 }, ]); }); (0, vitest_1.it)("should respect per_page parameter", async () => { // Arrange const mockResponse = { data: { stories: [{ id: 1 }], }, total: 1, }; api_1.api.stories.getAll.mockResolvedValue(mockResponse); // Act await api_1.api.stories.getAll({ per_page: 50 }); // Assert (0, vitest_1.expect)(api_1.api.stories.getAll).toHaveBeenCalledWith({ per_page: 50 }); }); (0, vitest_1.it)("should handle empty response", async () => { // Arrange const mockResponse = { data: { stories: [], }, total: 0, }; api_1.api.stories.getAll.mockResolvedValue(mockResponse); // Act const result = await api_1.api.stories.getAll(); // Assert (0, vitest_1.expect)(result.data.stories).toHaveLength(0); }); }); (0, vitest_1.describe)("wrapRequest", () => { (0, vitest_1.it)("should handle GET request with pagination", async () => { // Arrange const mockResponse = { data: { stories: [{ id: 1 }, { id: 2 }], }, total: 2, }; api_1.api.stories.getAll.mockResolvedValue(mockResponse); // Act const result = await api_1.api.stories.getAll(); // Assert (0, vitest_1.expect)(result.data.stories).toEqual(mockResponse.data.stories); }); (0, vitest_1.it)("should handle POST request", async () => { // Arrange const mockStory = { name: "Test Story", slug: "test-story" }; const mockResponse = { data: { story: { ...mockStory, id: 1 }, }, }; api_1.api.stories.create.mockResolvedValue(mockResponse); // Act const result = await api_1.api.stories.create(mockStory); // Assert (0, vitest_1.expect)(result.data.story).toEqual(mockResponse.data.story); (0, vitest_1.expect)(api_1.api.stories.create).toHaveBeenCalledWith(mockStory); }); (0, vitest_1.it)("should handle PUT request", async () => { // Arrange const mockStory = { id: 1, name: "Updated Story", slug: "test-story" }; const mockResponse = { data: { story: mockStory, }, }; api_1.api.stories.update.mockResolvedValue(mockResponse); // Act const result = await api_1.api.stories.update(mockStory); // Assert (0, vitest_1.expect)(result.data.story).toEqual(mockResponse.data.story); (0, vitest_1.expect)(api_1.api.stories.update).toHaveBeenCalledWith(mockStory); }); (0, vitest_1.it)("should handle DELETE request", async () => { // Arrange const mockResponse = { data: { story: { id: 1 }, }, }; api_1.api.stories.delete.mockResolvedValue(mockResponse); // Act const result = await api_1.api.stories.delete(1); // Assert (0, vitest_1.expect)(result.data.story).toEqual(mockResponse.data.story); (0, vitest_1.expect)(api_1.api.stories.delete).toHaveBeenCalledWith(1); }); (0, vitest_1.it)("should handle API errors", async () => { // Arrange const error = new Error("API Error"); api_1.api.stories.getAll.mockRejectedValue(error); // Act & Assert await (0, vitest_1.expect)(api_1.api.stories.getAll()).rejects.toThrow("API Error"); }); }); (0, vitest_1.describe)("API Methods", () => { const mockStory = { id: 123, name: "Test Story", slug: "test-story", }; (0, vitest_1.describe)("stories", () => { (0, vitest_1.it)("should get story by ID", async () => { // Arrange const mockResponse = { data: { story: mockStory } }; api_1.api.stories.get.mockResolvedValue(mockResponse); // Act const result = await api_1.api.stories.get(123); // Assert (0, vitest_1.expect)(result.data.story).toEqual(mockStory); }); (0, vitest_1.it)("should get story by slug", async () => { // Arrange api_1.api.stories.getBySlug.mockResolvedValue(mockStory); // Act const result = await api_1.api.stories.getBySlug("test-story"); // Assert (0, vitest_1.expect)(result).toEqual(mockStory); }); (0, vitest_1.it)("should throw error if story not found by slug", async () => { // Arrange api_1.api.stories.getBySlug.mockRejectedValue(new Error('Story with slug "non-existent" not found')); // Act & Assert await (0, vitest_1.expect)(api_1.api.stories.getBySlug("non-existent")).rejects.toThrow('Story with slug "non-existent" not found'); }); }); (0, vitest_1.describe)("componentGroups", () => { const mockComponentGroup = { id: 123, name: "Test Group", components: [], }; (0, vitest_1.it)("should get all component groups", async () => { // Arrange const mockResponse = { data: { component_groups: [mockComponentGroup], }, }; api_1.api.componentGroups.getAll.mockResolvedValue(mockResponse); // Act const result = await api_1.api.componentGroups.getAll(); // Assert (0, vitest_1.expect)(result.data.component_groups).toEqual([mockComponentGroup]); }); (0, vitest_1.it)("should get component group by ID", async () => { // Arrange const mockResponse = { data: { component_group: mockComponentGroup, }, }; api_1.api.componentGroups.get.mockResolvedValue(mockResponse); // Act const result = await api_1.api.componentGroups.get(123); // Assert (0, vitest_1.expect)(result.data.component_group).toEqual(mockComponentGroup); }); (0, vitest_1.it)("should create component group", async () => { // Arrange const newGroup = { name: "New Group" }; const mockResponse = { data: { component_group: { ...newGroup, id: 123 }, }, }; api_1.api.componentGroups.create.mockResolvedValue(mockResponse); // Act const result = await api_1.api.componentGroups.create(newGroup); // Assert (0, vitest_1.expect)(result.data.component_group).toEqual({ ...newGroup, id: 123 }); }); (0, vitest_1.it)("should update component group", async () => { // Arrange const updatedGroup = { ...mockComponentGroup, name: "Updated Group" }; const mockResponse = { data: { component_group: updatedGroup, }, }; api_1.api.componentGroups.update.mockResolvedValue(mockResponse); // Act const result = await api_1.api.componentGroups.update(updatedGroup); // Assert (0, vitest_1.expect)(result.data.component_group).toEqual(updatedGroup); }); (0, vitest_1.it)("should delete component group", async () => { // Arrange const mockResponse = { data: { component_group: mockComponentGroup, }, }; api_1.api.componentGroups.delete.mockResolvedValue(mockResponse); // Act const result = await api_1.api.componentGroups.delete(123); // Assert (0, vitest_1.expect)(result.data.component_group).toEqual(mockComponentGroup); }); }); (0, vitest_1.describe)("components", () => { const mockComponent = { id: 123, name: "Test Component", schema: {}, created_at: "2024-01-01T00:00:00Z", updated_at: "2024-01-01T00:00:00Z", }; (0, vitest_1.it)("should get all components", async () => { // Arrange const mockResponse = { data: { components: [mockComponent], }, }; api_1.api.components.getAll.mockResolvedValue(mockResponse); // Act const result = await api_1.api.components.getAll(); // Assert (0, vitest_1.expect)(result.data.components).toEqual([mockComponent]); }); (0, vitest_1.it)("should get component by ID", async () => { // Arrange const mockResponse = { data: { component: mockComponent, }, }; api_1.api.components.get.mockResolvedValue(mockResponse); // Act const result = await api_1.api.components.get(123); // Assert (0, vitest_1.expect)(result.data.component).toEqual(mockComponent); }); (0, vitest_1.it)("should create component", async () => { // Arrange const newComponent = { name: "New Component", schema: {} }; const mockResponse = { data: { component: { ...newComponent, id: 123 }, }, }; api_1.api.components.create.mockResolvedValue(mockResponse); // Act const result = await api_1.api.components.create(newComponent); // Assert (0, vitest_1.expect)(result.data.component).toEqual({ ...newComponent, id: 123 }); }); (0, vitest_1.it)("should update component", async () => { // Arrange const updatedComponent = { ...mockComponent, name: "Updated Component", }; const mockResponse = { data: { component: updatedComponent, }, }; api_1.api.components.update.mockResolvedValue(mockResponse); // Act const result = await api_1.api.components.update(updatedComponent); // Assert (0, vitest_1.expect)(result.data.component).toEqual(updatedComponent); }); (0, vitest_1.it)("should delete component", async () => { // Arrange const mockResponse = { data: { component: mockComponent, }, }; api_1.api.components.delete.mockResolvedValue(mockResponse); // Act const result = await api_1.api.components.delete(123); // Assert (0, vitest_1.expect)(result.data.component).toEqual(mockComponent); }); }); (0, vitest_1.describe)("spaces", () => { const mockSpace = { id: 123, name: "Test Space", options: { languages: ["en", "de"], }, }; (0, vitest_1.it)("should get space options", async () => { // Arrange api_1.api.spaces.getSpaceOptions.mockResolvedValue(mockSpace.options); // Act const result = await api_1.api.spaces.getSpaceOptions(); // Assert (0, vitest_1.expect)(result).toEqual(mockSpace.options); }); (0, vitest_1.it)("should get space languages", async () => { // Arrange api_1.api.spaces.getSpaceLanguages.mockResolvedValue(mockSpace.options.languages); // Act const result = await api_1.api.spaces.getSpaceLanguages(); // Assert (0, vitest_1.expect)(result).toEqual(mockSpace.options.languages); }); }); (0, vitest_1.describe)("datasources", () => { const mockDatasource = { id: 123, name: "Test Datasource", slug: "test-datasource", dimensions: [], created_at: "2024-01-01T00:00:00Z", updated_at: "2024-01-01T00:00:00Z", }; (0, vitest_1.it)("should get all datasources", async () => { // Arrange const mockResponse = { data: { datasources: [mockDatasource], }, }; api_1.api.datasources.getAll.mockResolvedValue(mockResponse); // Act const result = await api_1.api.datasources.getAll(); // Assert (0, vitest_1.expect)(result.data.datasources).toEqual([mockDatasource]); }); (0, vitest_1.it)("should get datasource by ID", async () => { // Arrange const mockResponse = { data: { datasource: mockDatasource, }, }; api_1.api.datasources.get.mockResolvedValue(mockResponse); // Act const result = await api_1.api.datasources.get(123); // Assert (0, vitest_1.expect)(result.data.datasource).toEqual(mockDatasource); }); (0, vitest_1.it)("should create datasource", async () => { // Arrange const newDatasource = { name: "New Datasource", slug: "new-datasource", }; const mockResponse = { data: { datasource: { ...newDatasource, id: 123 }, }, }; api_1.api.datasources.create.mockResolvedValue(mockResponse); // Act const result = await api_1.api.datasources.create(newDatasource); // Assert (0, vitest_1.expect)(result.data.datasource).toEqual({ ...newDatasource, id: 123 }); }); (0, vitest_1.it)("should update datasource", async () => { // Arrange const updatedDatasource = { ...mockDatasource, name: "Updated Datasource", }; const mockResponse = { data: { datasource: updatedDatasource, }, }; api_1.api.datasources.update.mockResolvedValue(mockResponse); // Act const result = await api_1.api.datasources.update(updatedDatasource); // Assert (0, vitest_1.expect)(result.data.datasource).toEqual(updatedDatasource); }); (0, vitest_1.it)("should delete datasource", async () => { // Arrange const mockResponse = { data: { datasource: mockDatasource, }, }; api_1.api.datasources.delete.mockResolvedValue(mockResponse); // Act const result = await api_1.api.datasources.delete(123); // Assert (0, vitest_1.expect)(result.data.datasource).toEqual(mockDatasource); }); (0, vitest_1.it)("should check if datasource exists", async () => { // Arrange api_1.api.datasources.has.mockResolvedValue(true); // Act const result = await api_1.api.datasources.has(123); // Assert (0, vitest_1.expect)(result).toBe(true); }); }); }); }); //# sourceMappingURL=api.test.js.map