Files
calendar/packages/app-store-cli/src/validateCreateAppFlags.test.ts
T

181 lines
5.7 KiB
TypeScript

import { describe, expect, it } from "vitest";
import { APP_CATEGORIES, VALID_CATEGORY_VALUES } from "./constants";
import { validateCreateAppFlags } from "./validateCreateAppFlags";
const VALID_TEMPLATES = [
"basic",
"booking-pages-tag",
"event-type-app-card",
"event-type-location-video-static",
"general-app-settings",
"link-as-an-app",
];
describe("validateCreateAppFlags", () => {
describe("template validation", () => {
it("returns error when template is empty", () => {
const result = validateCreateAppFlags({
template: "",
category: "other",
validTemplateValues: VALID_TEMPLATES,
});
expect(result).toContain("--template is required in non-interactive mode");
expect(result).toContain("basic");
});
it("returns error for invalid template", () => {
const result = validateCreateAppFlags({
template: "nonexistent-template",
category: "other",
validTemplateValues: VALID_TEMPLATES,
});
expect(result).toContain("Invalid template: nonexistent-template");
expect(result).toContain("Available templates:");
});
it("accepts all valid templates", () => {
for (const template of VALID_TEMPLATES) {
const result = validateCreateAppFlags({
template,
category: "other",
externalLinkUrl: template === "link-as-an-app" ? "https://example.com" : undefined,
validTemplateValues: VALID_TEMPLATES,
});
expect(result).toBeNull();
}
});
});
describe("category validation", () => {
it("returns error for invalid category", () => {
const result = validateCreateAppFlags({
template: "basic",
category: "invalid-category",
validTemplateValues: VALID_TEMPLATES,
});
expect(result).toContain("Invalid category: invalid-category");
expect(result).toContain("Available categories:");
});
it("accepts all valid categories", () => {
for (const category of VALID_CATEGORY_VALUES) {
const result = validateCreateAppFlags({
template: "basic",
category,
validTemplateValues: VALID_TEMPLATES,
});
expect(result).toBeNull();
}
});
});
describe("link-as-an-app external URL validation", () => {
it("returns error when link-as-an-app template is used without external URL", () => {
const result = validateCreateAppFlags({
template: "link-as-an-app",
category: "other",
validTemplateValues: VALID_TEMPLATES,
});
expect(result).toBe("--external-link-url is required when using the link-as-an-app template.");
});
it("returns error when externalLinkUrl is empty string for link-as-an-app", () => {
const result = validateCreateAppFlags({
template: "link-as-an-app",
category: "other",
externalLinkUrl: "",
validTemplateValues: VALID_TEMPLATES,
});
expect(result).toBe("--external-link-url is required when using the link-as-an-app template.");
});
it("accepts link-as-an-app with valid external URL", () => {
const result = validateCreateAppFlags({
template: "link-as-an-app",
category: "other",
externalLinkUrl: "https://example.com",
validTemplateValues: VALID_TEMPLATES,
});
expect(result).toBeNull();
});
it("does not require external URL for non-link-as-an-app templates", () => {
const result = validateCreateAppFlags({
template: "basic",
category: "other",
validTemplateValues: VALID_TEMPLATES,
});
expect(result).toBeNull();
});
});
describe("valid inputs", () => {
it("returns null for basic template with valid category", () => {
const result = validateCreateAppFlags({
template: "basic",
category: "analytics",
validTemplateValues: VALID_TEMPLATES,
});
expect(result).toBeNull();
});
it("returns null for link-as-an-app with external URL", () => {
const result = validateCreateAppFlags({
template: "link-as-an-app",
category: "conferencing",
externalLinkUrl: "https://x.com/calcom",
validTemplateValues: VALID_TEMPLATES,
});
expect(result).toBeNull();
});
});
describe("validation order", () => {
it("checks template before category", () => {
const result = validateCreateAppFlags({
template: "",
category: "invalid",
validTemplateValues: VALID_TEMPLATES,
});
expect(result).toContain("--template is required");
});
it("checks category before external URL", () => {
const result = validateCreateAppFlags({
template: "link-as-an-app",
category: "invalid",
validTemplateValues: VALID_TEMPLATES,
});
expect(result).toContain("Invalid category");
});
});
});
describe("constants", () => {
it("APP_CATEGORIES contains expected categories", () => {
const values = APP_CATEGORIES.map((c) => c.value);
expect(values).toContain("analytics");
expect(values).toContain("automation");
expect(values).toContain("calendar");
expect(values).toContain("conferencing");
expect(values).toContain("crm");
expect(values).toContain("messaging");
expect(values).toContain("payment");
expect(values).toContain("other");
});
it("APP_CATEGORIES has label and value for each entry", () => {
for (const cat of APP_CATEGORIES) {
expect(cat).toHaveProperty("label");
expect(cat).toHaveProperty("value");
expect(typeof cat.label).toBe("string");
expect(typeof cat.value).toBe("string");
}
});
it("VALID_CATEGORY_VALUES matches APP_CATEGORIES values", () => {
expect(VALID_CATEGORY_VALUES).toEqual(APP_CATEGORIES.map((c) => c.value));
});
});