mirror of
https://github.com/ghndrx/k8s-game-2048.git
synced 2026-02-10 06:45:07 +00:00
- Add Playwright configuration with multi-browser testing - Create basic functionality tests for game mechanics - Add gameplay tests with keyboard and touch interactions - Implement visual regression testing with screenshots - Add environment-specific tests for dev/staging/prod - Include health endpoint and security header validation - Set up test infrastructure for CI/CD pipeline
84 lines
2.8 KiB
TypeScript
84 lines
2.8 KiB
TypeScript
import { test, expect } from '@playwright/test';
|
|
|
|
test.describe('2048 Game - Gameplay Tests', () => {
|
|
test.beforeEach(async ({ page }) => {
|
|
await page.goto('/');
|
|
await page.waitForLoadState('networkidle');
|
|
});
|
|
|
|
test('should move tiles with arrow keys', async ({ page }) => {
|
|
// Get initial tile positions
|
|
const initialTiles = await page.locator('.tile').all();
|
|
const initialPositions = [];
|
|
|
|
for (const tile of initialTiles) {
|
|
const style = await tile.getAttribute('style');
|
|
initialPositions.push(style);
|
|
}
|
|
|
|
// Press arrow key to move tiles
|
|
await page.keyboard.press('ArrowRight');
|
|
await page.waitForTimeout(500); // Wait for animation
|
|
|
|
// Check that tiles moved or new tile appeared
|
|
const newTiles = await page.locator('.tile').all();
|
|
expect(newTiles.length).toBeGreaterThanOrEqual(2);
|
|
|
|
// At least one tile should have moved or new tile should appear
|
|
let tilesChanged = newTiles.length > initialTiles.length;
|
|
|
|
if (!tilesChanged) {
|
|
for (let i = 0; i < Math.min(newTiles.length, initialPositions.length); i++) {
|
|
const newStyle = await newTiles[i].getAttribute('style');
|
|
if (newStyle !== initialPositions[i]) {
|
|
tilesChanged = true;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
expect(tilesChanged).toBe(true);
|
|
});
|
|
|
|
test('should handle touch/swipe on mobile', async ({ page, isMobile }) => {
|
|
test.skip(!isMobile, 'Touch test only for mobile');
|
|
|
|
const gameContainer = page.locator('.game-container');
|
|
|
|
// Simulate swipe right
|
|
await gameContainer.touchStart([{ x: 100, y: 200 }]);
|
|
await gameContainer.touchEnd([{ x: 300, y: 200 }]);
|
|
|
|
await page.waitForTimeout(500);
|
|
|
|
// Should have tiles after swipe
|
|
const tiles = page.locator('.tile');
|
|
await expect(tiles).toHaveCount.atLeast(2);
|
|
});
|
|
|
|
test('should update score when tiles merge', async ({ page }) => {
|
|
// This test might need multiple moves to get mergeable tiles
|
|
// For now, just verify score element updates
|
|
const scoreElement = page.locator('#score');
|
|
const initialScore = await scoreElement.textContent();
|
|
|
|
// Try multiple moves to potentially trigger a merge
|
|
for (let i = 0; i < 10; i++) {
|
|
await page.keyboard.press('ArrowRight');
|
|
await page.waitForTimeout(200);
|
|
await page.keyboard.press('ArrowDown');
|
|
await page.waitForTimeout(200);
|
|
await page.keyboard.press('ArrowLeft');
|
|
await page.waitForTimeout(200);
|
|
await page.keyboard.press('ArrowUp');
|
|
await page.waitForTimeout(200);
|
|
|
|
const currentScore = await scoreElement.textContent();
|
|
if (currentScore !== initialScore) {
|
|
expect(parseInt(currentScore || '0')).toBeGreaterThan(parseInt(initialScore || '0'));
|
|
break;
|
|
}
|
|
}
|
|
});
|
|
});
|