@jungvonmatt/sb-migrate
Version:
CLI tool for managing Storyblok schema and content migrations
564 lines • 23.8 kB
JavaScript
"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