File size: 2,753 Bytes
afd56bc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import { test, expect } from '@playwright/test';

// Zakładamy, że aplikacja będzie używać tzw. Testing Tokens z Clerk
// albo, że frontend zostanie uruchomiony w trybie omijającym auth na czas testów (Mock).
const FRONTEND_URL = process.env.E2E_BASE_URL || 'http://localhost:5173';

test.describe('Kreator Nowego Projektu (Wizard UI)', () => {
  // Omijamy prawdziwe logowanie dla testów UI, symulując ciasteczka lub mockując API
  // Tutaj zakładamy, że w środowisku CI ominiemy Clerk Auth dla ścieżek testowych.
  
  test.beforeEach(async ({ page }) => {
    // Przechodzimy bezpośrednio do kreatora projektu
    // Jeśli testy będa blokowane przez Clerk, należy zaimplementować clerk.signIn() za pomocą Testing Tokenu
    await page.goto(`${FRONTEND_URL}/dashboard/new`);
    await page.waitForTimeout(1000);
  });

  test('Krok 1: Walidacja i wpisanie NIPu firmy', async ({ page }) => {
    // Szukamy pola na NIP
    const nipInput = page.locator('input[name="nip"], input[placeholder*="NIP"]');
    
    // Upewniamy się, że pole jest widoczne
    if (await nipInput.isVisible()) {
      await nipInput.fill('1234567890');
      
      const nextButton = page.locator('button:has-text("Dalej"), button:has-text("Pobierz dane")');
      await expect(nextButton).toBeEnabled();
      await nextButton.click();
      
      // Oczekujemy że pojawi się informacja o pobranej firmie z GUS lub przejście do kolejnego kroku
      await expect(page.locator('text=/GUS|Krok 2/i')).toBeVisible({ timeout: 10000 });
    } else {
      console.log('UWAGA: Auth Clerk zablokował dostęp. Skonfiguruj E2E_CLERK_TOKEN w GitHub Actions.');
    }
  });

  test('Krok 2: Opis projektu powinen wymagać minimum 50 znaków', async ({ page }) => {
    const descInput = page.locator('textarea[name="description"], textarea[placeholder*="Opisz swój projekt"]');
    if (await descInput.isVisible()) {
      await descInput.fill('Za krótki opis');
      
      const nextButton = page.locator('button:has-text("Dalej"), button:has-text("Analizuj")');
      await nextButton.click();
      
      // Oczekujemy błędu walidacji formularza
      await expect(page.locator('text=/zbyt krótki|wymagane minimum/i')).toBeVisible();
    }
  });

  test('Mokowanie odpowiedzi AI Matchera (Zapobieganie timeoutom E2E)', async ({ page }) => {
    // Interceptujemy żądania do backendu (AI Matcher), żeby test był szybki i deterministyczny
    await page.route('**/api/projects/match**', async route => {
      const json = {
        programs: [
          { name: "MOCK: Ścieżka SMART", description: "Dotacja na B+R", match_score: 95 }
        ]
      };
      await route.fulfill({ json });
    });

    // Tu kontynuujemy test...
  });
});