@restnfeel/agentc-starter-kit
Version:
한국어 기업용 CMS 모듈 - Task Master AI와 함께 빠르게 웹사이트를 구현할 수 있는 재사용 가능한 컴포넌트 시스템
344 lines (304 loc) • 12.2 kB
text/typescript
/**
* Template System Integration Tests
* 템플릿 시스템의 기본 기능과 통합 테스트
*/
import { describe, test, expect } from "@jest/globals";
import {
ServiceTier,
ComponentType,
TIER_COMPONENT_MAP,
TIER_COMPONENT_LIMITS,
isComponentAllowedInTier,
getAvailableComponentsForTier,
getMinimumTierForComponent,
getNewComponentsAfterUpgrade,
calculateTemplateComplexity,
TIER_INFO,
COMPONENT_COMPLEXITY,
RECOMMENDED_COMPONENT_SETS,
} from "../index";
describe("Template System Core Functions", () => {
describe("Tier Component Validation", () => {
test("should validate components for Starter tier", () => {
expect(
isComponentAllowedInTier(ComponentType.HERO, ServiceTier.STARTER)
).toBe(true);
expect(
isComponentAllowedInTier(ComponentType.ABOUT, ServiceTier.STARTER)
).toBe(true);
expect(
isComponentAllowedInTier(ComponentType.CONTACT, ServiceTier.STARTER)
).toBe(true);
expect(
isComponentAllowedInTier(ComponentType.FOOTER, ServiceTier.STARTER)
).toBe(true);
// These should not be allowed in Starter
expect(
isComponentAllowedInTier(ComponentType.SERVICES, ServiceTier.STARTER)
).toBe(false);
expect(
isComponentAllowedInTier(
ComponentType.TESTIMONIALS,
ServiceTier.STARTER
)
).toBe(false);
expect(
isComponentAllowedInTier(ComponentType.TEAM, ServiceTier.STARTER)
).toBe(false);
});
test("should validate components for Standard tier", () => {
expect(
isComponentAllowedInTier(ComponentType.SERVICES, ServiceTier.STANDARD)
).toBe(true);
expect(
isComponentAllowedInTier(
ComponentType.TESTIMONIALS,
ServiceTier.STANDARD
)
).toBe(true);
expect(
isComponentAllowedInTier(ComponentType.PORTFOLIO, ServiceTier.STANDARD)
).toBe(true);
// Plus tier exclusive components should not be allowed
expect(
isComponentAllowedInTier(ComponentType.TEAM, ServiceTier.STANDARD)
).toBe(false);
expect(
isComponentAllowedInTier(ComponentType.PRICING, ServiceTier.STANDARD)
).toBe(false);
expect(
isComponentAllowedInTier(ComponentType.FAQ, ServiceTier.STANDARD)
).toBe(false);
});
test("should validate components for Plus tier", () => {
expect(
isComponentAllowedInTier(ComponentType.TEAM, ServiceTier.PLUS)
).toBe(true);
expect(
isComponentAllowedInTier(ComponentType.PRICING, ServiceTier.PLUS)
).toBe(true);
expect(
isComponentAllowedInTier(ComponentType.FAQ, ServiceTier.PLUS)
).toBe(true);
expect(
isComponentAllowedInTier(ComponentType.BLOG, ServiceTier.PLUS)
).toBe(true);
});
});
describe("Component Limits", () => {
test("should have correct component limits per tier", () => {
expect(TIER_COMPONENT_LIMITS[ServiceTier.STARTER]).toBe(4);
expect(TIER_COMPONENT_LIMITS[ServiceTier.STANDARD]).toBe(7);
expect(TIER_COMPONENT_LIMITS[ServiceTier.PLUS]).toBe(Infinity);
});
test("should match component counts with tier limits", () => {
expect(TIER_COMPONENT_MAP[ServiceTier.STARTER].length).toBe(4);
expect(TIER_COMPONENT_MAP[ServiceTier.STANDARD].length).toBe(7);
expect(TIER_COMPONENT_MAP[ServiceTier.PLUS].length).toBe(11);
});
});
describe("Available Components", () => {
test("should return correct available components for each tier", () => {
const starterComponents = getAvailableComponentsForTier(
ServiceTier.STARTER
);
expect(starterComponents).toHaveLength(4);
expect(starterComponents).toContain(ComponentType.HERO);
expect(starterComponents).toContain(ComponentType.ABOUT);
const standardComponents = getAvailableComponentsForTier(
ServiceTier.STANDARD
);
expect(standardComponents).toHaveLength(7);
expect(standardComponents).toContain(ComponentType.SERVICES);
expect(standardComponents).toContain(ComponentType.TESTIMONIALS);
const plusComponents = getAvailableComponentsForTier(ServiceTier.PLUS);
expect(plusComponents).toHaveLength(11);
expect(plusComponents).toContain(ComponentType.TEAM);
expect(plusComponents).toContain(ComponentType.PRICING);
});
});
describe("Minimum Tier Requirements", () => {
test("should return correct minimum tier for basic components", () => {
expect(getMinimumTierForComponent(ComponentType.HERO)).toBe(
ServiceTier.STARTER
);
expect(getMinimumTierForComponent(ComponentType.ABOUT)).toBe(
ServiceTier.STARTER
);
expect(getMinimumTierForComponent(ComponentType.CONTACT)).toBe(
ServiceTier.STARTER
);
expect(getMinimumTierForComponent(ComponentType.FOOTER)).toBe(
ServiceTier.STARTER
);
});
test("should return correct minimum tier for standard components", () => {
expect(getMinimumTierForComponent(ComponentType.SERVICES)).toBe(
ServiceTier.STANDARD
);
expect(getMinimumTierForComponent(ComponentType.TESTIMONIALS)).toBe(
ServiceTier.STANDARD
);
expect(getMinimumTierForComponent(ComponentType.PORTFOLIO)).toBe(
ServiceTier.STANDARD
);
});
test("should return correct minimum tier for plus components", () => {
expect(getMinimumTierForComponent(ComponentType.TEAM)).toBe(
ServiceTier.PLUS
);
expect(getMinimumTierForComponent(ComponentType.PRICING)).toBe(
ServiceTier.PLUS
);
expect(getMinimumTierForComponent(ComponentType.FAQ)).toBe(
ServiceTier.PLUS
);
expect(getMinimumTierForComponent(ComponentType.BLOG)).toBe(
ServiceTier.PLUS
);
});
});
describe("Tier Upgrades", () => {
test("should return new components after upgrade from Starter to Standard", () => {
const newComponents = getNewComponentsAfterUpgrade(
ServiceTier.STARTER,
ServiceTier.STANDARD
);
expect(newComponents).toHaveLength(3);
expect(newComponents).toContain(ComponentType.SERVICES);
expect(newComponents).toContain(ComponentType.TESTIMONIALS);
expect(newComponents).toContain(ComponentType.PORTFOLIO);
});
test("should return new components after upgrade from Standard to Plus", () => {
const newComponents = getNewComponentsAfterUpgrade(
ServiceTier.STANDARD,
ServiceTier.PLUS
);
expect(newComponents).toHaveLength(4);
expect(newComponents).toContain(ComponentType.TEAM);
expect(newComponents).toContain(ComponentType.PRICING);
expect(newComponents).toContain(ComponentType.FAQ);
expect(newComponents).toContain(ComponentType.BLOG);
});
test("should return new components after upgrade from Starter to Plus", () => {
const newComponents = getNewComponentsAfterUpgrade(
ServiceTier.STARTER,
ServiceTier.PLUS
);
expect(newComponents).toHaveLength(7);
expect(newComponents).toContain(ComponentType.SERVICES);
expect(newComponents).toContain(ComponentType.TEAM);
expect(newComponents).toContain(ComponentType.PRICING);
});
});
describe("Template Complexity", () => {
test("should calculate correct complexity for simple template", () => {
const simpleTemplate = [
ComponentType.HERO,
ComponentType.ABOUT,
ComponentType.CONTACT,
ComponentType.FOOTER,
];
const complexity = calculateTemplateComplexity(simpleTemplate);
const expectedComplexity = 1 + 1 + 2 + 1; // hero + about + contact + footer
expect(complexity).toBe(expectedComplexity);
});
test("should calculate correct complexity for complex template", () => {
const complexTemplate = [
ComponentType.HERO,
ComponentType.SERVICES,
ComponentType.PRICING,
ComponentType.TEAM,
ComponentType.FAQ,
];
const complexity = calculateTemplateComplexity(complexTemplate);
const expectedComplexity = 1 + 3 + 5 + 4 + 3; // hero + services + pricing + team + faq
expect(complexity).toBe(expectedComplexity);
});
});
describe("Tier Information", () => {
test("should have correct tier information structure", () => {
expect(TIER_INFO[ServiceTier.STARTER]).toHaveProperty("name");
expect(TIER_INFO[ServiceTier.STARTER]).toHaveProperty("description");
expect(TIER_INFO[ServiceTier.STARTER]).toHaveProperty("price");
expect(TIER_INFO[ServiceTier.STARTER]).toHaveProperty("maxComponents");
expect(TIER_INFO[ServiceTier.STARTER]).toHaveProperty("features");
});
test("should have correct pricing structure", () => {
expect(TIER_INFO[ServiceTier.STARTER].price).toHaveProperty("monthly");
expect(TIER_INFO[ServiceTier.STARTER].price).toHaveProperty("yearly");
expect(typeof TIER_INFO[ServiceTier.STARTER].price.monthly).toBe(
"number"
);
expect(typeof TIER_INFO[ServiceTier.STARTER].price.yearly).toBe("number");
});
});
describe("Component Complexity Constants", () => {
test("should have complexity ratings for all component types", () => {
const allComponentTypes = Object.values(ComponentType);
allComponentTypes.forEach((componentType) => {
expect(COMPONENT_COMPLEXITY).toHaveProperty(componentType);
expect(typeof COMPONENT_COMPLEXITY[componentType]).toBe("number");
expect(COMPONENT_COMPLEXITY[componentType]).toBeGreaterThan(0);
expect(COMPONENT_COMPLEXITY[componentType]).toBeLessThanOrEqual(5);
});
});
});
describe("Recommended Component Sets", () => {
test("should have valid component sets for different use cases", () => {
const useCases = Object.keys(RECOMMENDED_COMPONENT_SETS);
expect(useCases).toContain("landing-page");
expect(useCases).toContain("corporate-website");
expect(useCases).toContain("portfolio-site");
expect(useCases).toContain("saas-product");
});
test("should have valid components in recommended sets", () => {
Object.values(RECOMMENDED_COMPONENT_SETS).forEach((componentSet) => {
expect(Array.isArray(componentSet)).toBe(true);
expect(componentSet.length).toBeGreaterThan(0);
componentSet.forEach((component) => {
expect(Object.values(ComponentType)).toContain(component);
});
});
});
test("landing page set should be suitable for Standard tier", () => {
const landingPageComponents = RECOMMENDED_COMPONENT_SETS["landing-page"];
const standardComponents = getAvailableComponentsForTier(
ServiceTier.STANDARD
);
landingPageComponents.forEach((component) => {
expect(standardComponents).toContain(component);
});
});
});
});
describe("Template System Integration", () => {
test("should maintain consistency across tier hierarchies", () => {
// Starter components should be included in Standard
const starterComponents = TIER_COMPONENT_MAP[ServiceTier.STARTER];
const standardComponents = TIER_COMPONENT_MAP[ServiceTier.STANDARD];
starterComponents.forEach((component) => {
expect(standardComponents).toContain(component);
});
// Standard components should be included in Plus
const plusComponents = TIER_COMPONENT_MAP[ServiceTier.PLUS];
standardComponents.forEach((component) => {
expect(plusComponents).toContain(component);
});
});
test("should have unique components per tier upgrade", () => {
const starterToStandard = getNewComponentsAfterUpgrade(
ServiceTier.STARTER,
ServiceTier.STANDARD
);
const standardToPlus = getNewComponentsAfterUpgrade(
ServiceTier.STANDARD,
ServiceTier.PLUS
);
// Should not have overlapping new components
const intersection = starterToStandard.filter((component) =>
standardToPlus.includes(component)
);
expect(intersection).toHaveLength(0);
});
});