Remove obsolete scripts and files, update site builder configurations

- Deleted the `import_plans.py`, `run_tests.py`, and `test_run.py` scripts as they are no longer needed.
- Updated the initial migration dependency in `0001_initial.py` to reflect recent changes in the `igny8_core_auth` app.
- Enhanced the implementation plan documentation to include new phases and updates on the site builder project.
- Updated the `vite.config.ts` and `package.json` to integrate testing configurations and dependencies for the site builder.
This commit is contained in:
IGNY8 VPS (Salman)
2025-11-17 17:48:15 +00:00
parent 5a36686844
commit 4b9e1a49a9
23 changed files with 4305 additions and 342 deletions

View File

@@ -0,0 +1,106 @@
import { describe, it, expect, vi, beforeEach } from 'vitest';
import { render, screen } from '@testing-library/react';
import { PreviewCanvas } from '../PreviewCanvas';
import { useSiteDefinitionStore } from '../../../state/siteDefinitionStore';
vi.mock('../../../state/siteDefinitionStore');
describe('PreviewCanvas', () => {
const mockSelectPage = vi.fn();
beforeEach(() => {
vi.clearAllMocks();
});
it('shows placeholder when no structure or pages', () => {
(useSiteDefinitionStore as any).mockReturnValue({
structure: undefined,
pages: [],
selectedSlug: undefined,
selectPage: mockSelectPage,
});
render(<PreviewCanvas />);
expect(screen.getByText(/generate a blueprint to see live previews/i)).toBeInTheDocument();
});
it('renders pages from structure', () => {
const mockStructure = {
site: { name: 'Test Site', primary_navigation: ['home', 'about'] },
pages: [
{ slug: 'home', title: 'Home', type: 'home', blocks: [] },
{ slug: 'about', title: 'About', type: 'about', blocks: [] },
],
};
(useSiteDefinitionStore as any).mockReturnValue({
structure: mockStructure,
pages: [],
selectedSlug: 'home',
selectPage: mockSelectPage,
});
render(<PreviewCanvas />);
expect(screen.getByText('Home')).toBeInTheDocument();
// Check for navigation button specifically (there are multiple "home" elements)
const navButtons = screen.getAllByText('home');
expect(navButtons.length).toBeGreaterThan(0);
});
it('renders pages from pages array when structure not available', () => {
const mockPages = [
{
id: 1,
site_blueprint: 1,
slug: 'services',
title: 'Services',
type: 'services',
status: 'ready',
order: 0,
blocks_json: [],
},
];
(useSiteDefinitionStore as any).mockReturnValue({
structure: undefined,
pages: mockPages,
selectedSlug: 'services',
selectPage: mockSelectPage,
});
render(<PreviewCanvas />);
expect(screen.getByText('Services')).toBeInTheDocument();
});
it('renders page blocks when available', () => {
const mockStructure = {
site: { name: 'Test Site' },
pages: [
{
slug: 'home',
title: 'Home',
type: 'home',
blocks: [
{ type: 'hero', heading: 'Welcome', subheading: 'Get started today' },
],
},
],
};
(useSiteDefinitionStore as any).mockReturnValue({
structure: mockStructure,
pages: [],
selectedSlug: 'home',
selectPage: mockSelectPage,
});
render(<PreviewCanvas />);
expect(screen.getByText('Welcome')).toBeInTheDocument();
expect(screen.getByText('Get started today')).toBeInTheDocument();
});
});

View File

@@ -0,0 +1,172 @@
import { describe, it, expect, vi, beforeEach } from 'vitest';
import { render, screen, fireEvent } from '@testing-library/react';
import { WizardPage } from '../WizardPage';
import { useBuilderStore } from '../../../state/builderStore';
import { useSiteDefinitionStore } from '../../../state/siteDefinitionStore';
// Mock stores
vi.mock('../../../state/builderStore');
vi.mock('../../../state/siteDefinitionStore');
describe('WizardPage', () => {
const mockSetField = vi.fn();
const mockNextStep = vi.fn();
const mockPreviousStep = vi.fn();
const mockSetStep = vi.fn();
const mockUpdateStyle = vi.fn();
const mockAddObjective = vi.fn();
const mockRemoveObjective = vi.fn();
const mockSubmitWizard = vi.fn();
beforeEach(() => {
vi.clearAllMocks();
(useBuilderStore as any).mockReturnValue({
form: {
siteId: null,
sectorId: null,
siteName: '',
businessType: '',
industry: '',
targetAudience: '',
hostingType: 'igny8_sites',
businessBrief: '',
objectives: [],
style: {},
},
currentStep: 0,
isSubmitting: false,
error: undefined,
activeBlueprint: undefined,
setField: mockSetField,
nextStep: mockNextStep,
previousStep: mockPreviousStep,
setStep: mockSetStep,
updateStyle: mockUpdateStyle,
addObjective: mockAddObjective,
removeObjective: mockRemoveObjective,
submitWizard: mockSubmitWizard,
refreshPages: vi.fn(),
});
(useSiteDefinitionStore as any).mockReturnValue({
structure: undefined,
});
});
it('renders wizard with step indicators', () => {
render(<WizardPage />);
expect(screen.getByText('Site builder wizard')).toBeInTheDocument();
expect(screen.getByText('Business')).toBeInTheDocument();
expect(screen.getByText('Brief')).toBeInTheDocument();
expect(screen.getByText('Objectives')).toBeInTheDocument();
expect(screen.getByText('Style')).toBeInTheDocument();
});
it('allows navigation between steps', () => {
render(<WizardPage />);
const briefButton = screen.getByText('Brief');
fireEvent.click(briefButton);
expect(mockSetStep).toHaveBeenCalledWith(1);
});
it('disables back button on first step', () => {
render(<WizardPage />);
const backButton = screen.getByText('Back');
expect(backButton).toBeDisabled();
});
it('enables back button after first step', () => {
(useBuilderStore as any).mockReturnValue({
form: {},
currentStep: 1,
isSubmitting: false,
error: undefined,
activeBlueprint: undefined,
setField: mockSetField,
nextStep: mockNextStep,
previousStep: mockPreviousStep,
setStep: mockSetStep,
updateStyle: mockUpdateStyle,
addObjective: mockAddObjective,
removeObjective: mockRemoveObjective,
submitWizard: mockSubmitWizard,
refreshPages: vi.fn(),
});
render(<WizardPage />);
const backButton = screen.getByText('Back');
expect(backButton).not.toBeDisabled();
fireEvent.click(backButton);
expect(mockPreviousStep).toHaveBeenCalled();
});
it('shows error message when present', () => {
(useBuilderStore as any).mockReturnValue({
form: {},
currentStep: 0,
isSubmitting: false,
error: 'Test error message',
activeBlueprint: undefined,
setField: mockSetField,
nextStep: mockNextStep,
previousStep: mockPreviousStep,
setStep: mockSetStep,
updateStyle: mockUpdateStyle,
addObjective: mockAddObjective,
removeObjective: mockRemoveObjective,
submitWizard: mockSubmitWizard,
refreshPages: vi.fn(),
});
render(<WizardPage />);
expect(screen.getByText('Test error message')).toBeInTheDocument();
});
it('shows loading state when submitting', () => {
(useBuilderStore as any).mockReturnValue({
form: {
siteId: null,
sectorId: null,
siteName: '',
businessType: '',
industry: '',
targetAudience: '',
hostingType: 'igny8_sites',
businessBrief: '',
objectives: [],
style: {
palette: 'Vibrant modern palette',
typography: 'Sans-serif',
personality: 'Confident',
heroImagery: 'Real people',
},
},
currentStep: 3,
isSubmitting: true,
error: undefined,
activeBlueprint: undefined,
setField: mockSetField,
nextStep: mockNextStep,
previousStep: mockPreviousStep,
setStep: mockSetStep,
updateStyle: mockUpdateStyle,
addObjective: mockAddObjective,
removeObjective: mockRemoveObjective,
submitWizard: mockSubmitWizard,
refreshPages: vi.fn(),
});
render(<WizardPage />);
// When submitting, button text changes to "Generating…"
const submitButton = screen.getByText(/generating/i);
expect(submitButton).toBeDisabled();
});
});