Files
ohm_streaming/full_test2.mjs
T
root 9e53579b36
CI / Test (Python 3.11) (pull_request) Has been cancelled
CI / Test (Python 3.12) (pull_request) Has been cancelled
CI / Lint (pull_request) Has been cancelled
CI / Type Check (pull_request) Has been cancelled
CI / Summary (pull_request) Has been cancelled
feat: flat design Sunset Glitch palette + Font Awesome icons
2026-04-04 07:59:46 +00:00

175 lines
5.8 KiB
JavaScript

import { chromium } from 'playwright';
const BASE = 'http://127.0.0.1:3000';
const opts = { waitUntil: 'domcontentloaded', timeout: 15000 };
(async () => {
const browser = await chromium.launch({ headless: true, args: ['--no-sandbox'] });
// Obtenir un token via API
const apiCtx = await browser.newContext();
const apiPage = await apiCtx.newPage();
await apiPage.goto(BASE + '/api/auth/login', opts);
const token = await apiPage.evaluate(async () => {
const res = await fetch('/api/auth/login', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ username: 'roman', password: 'roman123' })
});
const data = await res.json();
return data.access_token || null;
});
await apiCtx.close();
console.log(`Token obtained: ${token ? token.substring(0, 20) + '...' : 'FAILED'}`);
if (!token) {
console.error('Cannot get token, aborting');
process.exit(1);
}
// ========== NON AUTHENTIFIE ==========
console.log('\n=== NON AUTHENTIFIE ===');
const anonCtx = await browser.newContext({ viewport: { width: 1440, height: 900 } });
const anon = await anonCtx.newPage();
const snap = async (p, name, url, wait = 3000) => {
try {
await p.goto(url, opts);
await p.waitForTimeout(wait);
await p.screenshot({ path: `/tmp/screenshots/${name}.png`, fullPage: false });
console.log(`OK: ${name}`);
} catch(e) {
console.log(`FAIL: ${name} - ${e.message}`);
}
};
await snap(anon, 'anon_01_home', `${BASE}/`);
await snap(anon, 'anon_02_watchlist', `${BASE}/watchlist`);
await snap(anon, 'anon_03_favorites', `${BASE}/favorites`);
await snap(anon, 'anon_04_downloads', `${BASE}/downloads`);
await snap(anon, 'anon_05_settings', `${BASE}/settings`);
await snap(anon, 'anon_06_recommendations', `${BASE}/recommendations`);
// ========== AUTHENTIFIE (cookie + localStorage) ==========
console.log('\n=== AUTHENTIFIE ===');
const authCtx = await browser.newContext({
viewport: { width: 1440, height: 900 },
});
// Injecter le token comme cookie AVANT toute navigation
await authCtx.addCookies([{
name: 'auth_token',
value: token,
domain: '127.0.0.1',
path: '/',
sameSite: 'Strict',
httpOnly: false,
}]);
const auth = await authCtx.newPage();
// Injecter dans localStorage au premier chargement
await auth.goto(BASE + '/', opts);
await auth.evaluate((t) => {
localStorage.setItem('auth_token', t);
}, token);
await auth.waitForTimeout(3000);
await auth.screenshot({ path: '/tmp/screenshots/auth_01_home.png', fullPage: false });
console.log('OK: auth_01_home');
await snap(auth, 'auth_02_watchlist', `${BASE}/watchlist`);
await snap(auth, 'auth_03_favorites', `${BASE}/favorites`);
await snap(auth, 'auth_04_downloads', `${BASE}/downloads`);
await snap(auth, 'auth_05_settings', `${BASE}/settings`);
await snap(auth, 'auth_06_recommendations', `${BASE}/recommendations`);
// ========== TESTS FONCTIONNELS ==========
console.log('\n=== TESTS FONCTIONNELS ===');
// Test API: toggle favori
const favResult = await auth.evaluate(async (t) => {
try {
const res = await fetch('/api/favorites/toggle', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${t}`
},
body: JSON.stringify({ content_type: 'anime', anime_id: 'test-screenshot-1', title: 'Test Screenshot Anime' })
});
const data = await res.json();
return { status: res.status, is_favorite: data.is_favorite };
} catch(e) {
return { error: e.message };
}
}, token);
console.log(`Favorite toggle: ${JSON.stringify(favResult)}`);
// Voir les favoris
await snap(auth, 'auth_07_favorites_after_add', `${BASE}/favorites`);
// Test API: ajouter watchlist item
const wlResult = await auth.evaluate(async (t) => {
try {
const res = await fetch('/api/watchlist', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${t}`
},
body: JSON.stringify({
anime_title: 'Test Screenshot Anime',
anime_url: 'https://example.com/anime/1',
episode_count: 12,
current_episode: 0,
status: 'watching'
})
});
const data = await res.json();
return { status: res.status, id: data.id, title: data.anime_title };
} catch(e) {
return { error: e.message };
}
}, token);
console.log(`Watchlist add: ${JSON.stringify(wlResult)}`);
// Voir la watchlist
await snap(auth, 'auth_08_watchlist_with_item', `${BASE}/watchlist`);
// Scroller sur la home
await auth.goto(`${BASE}/`, opts);
await auth.waitForTimeout(2000);
await auth.evaluate(() => window.scrollTo(0, 600));
await auth.waitForTimeout(1000);
await auth.screenshot({ path: '/tmp/screenshots/auth_09_home_scrolled.png', fullPage: false });
console.log('OK: auth_09_home_scrolled');
// ========== NETTOYAGE ==========
console.log('\n=== Nettoyage ===');
// Retirer le favori de test
await auth.evaluate(async (t) => {
await fetch('/api/favorites/toggle', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${t}`
},
body: JSON.stringify({ content_type: 'anime', anime_id: 'test-screenshot-1', title: 'Test Screenshot Anime' })
});
});
// Retirer le watchlist item de test
if (wlResult.id) {
await auth.evaluate(async ({t, id}) => {
await fetch(`/api/watchlist/${id}`, {
method: 'DELETE',
headers: { 'Authorization': `Bearer ${t}` }
});
}, { t: token, id: wlResult.id });
console.log('Test watchlist item deleted');
}
console.log('Test favorite removed');
await browser.close();
console.log('\n=== ALL DONE ===');
})();