describe('Projects Management', () => { beforeEach(() => { // Mock authentication cy.window().then((win) => { win.localStorage.setItem('auth_token', 'mock-jwt-token') }) cy.intercept('GET', '**/profile', { statusCode: 200, body: { id: 1, name: 'Test User', email: 'test@example.com', roles: ['CLIENT'], createdAt: new Date().toISOString() } }).as('profile') }) it('displays projects list', () => { cy.intercept('GET', '**/projects', { statusCode: 200, body: [ { id: 1, name: 'Project Alpha', description: 'First project', status: 'ACTIVE', createdAt: new Date().toISOString(), updatedAt: new Date().toISOString() }, { id: 2, name: 'Project Beta', description: 'Second project', status: 'PLANNING', createdAt: new Date().toISOString(), updatedAt: new Date().toISOString() } ] }).as('getProjects') cy.visit('/projects') cy.wait('@getProjects') cy.contains('Project Alpha').should('be.visible') cy.contains('Project Beta').should('be.visible') }) it('can create a new project', () => { cy.intercept('GET', '**/projects', { statusCode: 200, body: [] }).as('getProjects') cy.intercept('POST', '**/projects', { statusCode: 201, body: { id: 1, name: 'New Project', description: 'Test project description', status: 'PLANNING', createdAt: new Date().toISOString(), updatedAt: new Date().toISOString() } }).as('createProject') cy.visit('/projects') cy.wait('@getProjects') cy.contains('button', 'New Project').click() cy.get('input[placeholder*="Project name"]').type('New Project') cy.get('textarea[placeholder*="description"]').type('Test project description') cy.contains('button', 'Create').click() cy.wait('@createProject') cy.contains('New Project').should('be.visible') }) it('navigates to project detail page', () => { cy.intercept('GET', '**/projects', { statusCode: 200, body: [ { id: 1, name: 'Project Alpha', description: 'First project', status: 'ACTIVE', createdAt: new Date().toISOString(), updatedAt: new Date().toISOString() } ] }).as('getProjects') cy.intercept('GET', '**/projects/1', { statusCode: 200, body: { id: 1, name: 'Project Alpha', description: 'First project', status: 'ACTIVE', createdAt: new Date().toISOString(), updatedAt: new Date().toISOString() } }).as('getProject') cy.intercept('GET', '**/tasks?project_id=1', { statusCode: 200, body: [] }).as('getTasks') cy.visit('/projects') cy.wait('@getProjects') cy.contains('Project Alpha').click() cy.wait('@getProject') cy.wait('@getTasks') cy.url().should('include', '/projects/1') cy.contains('h2', 'Project Alpha').should('be.visible') }) it('can add tasks to a project', () => { cy.intercept('GET', '**/projects/1', { statusCode: 200, body: { id: 1, name: 'Project Alpha', description: 'First project', status: 'ACTIVE', createdAt: new Date().toISOString(), updatedAt: new Date().toISOString() } }).as('getProject') cy.intercept('GET', '**/tasks?project_id=1', { statusCode: 200, body: [] }).as('getTasks') cy.intercept('POST', '**/tasks', { statusCode: 201, body: { id: 1, projectId: 1, title: 'New Task', description: 'Task description', status: 'TODO', priority: 1, createdAt: new Date().toISOString(), updatedAt: new Date().toISOString() } }).as('createTask') cy.visit('/projects/1') cy.wait('@getProject') cy.wait('@getTasks') cy.contains('button', 'Add Task').click() cy.get('input[placeholder*="Task title"]').type('New Task') cy.get('textarea[placeholder*="description"]').type('Task description') cy.contains('button', 'Create').click() cy.wait('@createTask') cy.contains('New Task').should('be.visible') }) })