#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Integracijski test Flask servera s mock aplikacijom """ import sqlite3 import json import sys import os import time import threading import requests from web.server import set_projector_app, run_server # Simuliraj SongProjector stanu class MockSongProjector: def __init__(self): self.current_song = None self.pages = [] self.current_page_index = 0 self.song_number = "" self.song_number_last = "" self.all_caps_mode = False self.waiting_for_song = True # Otvori bazu try: self.conn = sqlite3.connect(f"file:songs.db?mode=ro", uri=True, check_same_thread=False) self.cursor = self.conn.cursor() except: self.conn = None self.cursor = None # Čitaj settings with open('settings.json', 'r', encoding='utf-8') as f: self.settings = json.load(f) def load_song(self): """Simulacija load_song metode""" if not self.song_number or not self.cursor: return song_number_to_load = self.song_number # Spremi broj prije nego što ga obriši try: song_id = int(song_number_to_load) self.cursor.execute("SELECT lyrics FROM songs WHERE id= ?", (song_id,)) result = self.cursor.fetchone() if result: lyrics = result[0] # Jednostavna podijela pesme na samo jednu stranicu za test self.pages = [lyrics] self.current_page_index = 0 self.waiting_for_song = False self.song_number_last = song_number_to_load else: self.pages = [] self.waiting_for_song = True except: self.pages = [] finally: self.song_number = "" def next_page(self): if self.pages and self.current_page_index + 1 < len(self.pages): self.current_page_index += 1 def prev_page(self): if self.pages and self.current_page_index > 0: self.current_page_index -= 1 def clear_screen(self): self.pages = [] self.current_page_index = 0 self.waiting_for_song = True def show_page(self): pass # Dummy def toggle_caps(self): self.all_caps_mode = not self.all_caps_mode self.show_page() # Kreiraj mock aplikaciju print("Iniciijalisiranje mock aplikacije...") mock_app = MockSongProjector() set_projector_app(mock_app) # Pokreni Flask server u zvjenoj niti print("Pokretanje Flask servera...") web_port = mock_app.settings.get('web_port', 5000) server_thread = threading.Thread( target=run_server, args=('127.0.0.1', web_port), daemon=True ) server_thread.start() # Čekaj da se server pokreće time.sleep(2) print("=" * 60) print("Test Flask API-ja") print("=" * 60) BASE_URL = f'http://127.0.0.1:{web_port}' try: print("\n1. GET / (HTML stranica)") response = requests.get(f'{BASE_URL}/') print(f" Status: {response.status_code}") print(f" HTML size: {len(response.text)} bytes") assert response.status_code == 200, f"Expected 200, got {response.status_code}" print(" PASS") print("\n2. GET /api/state (initial state)") response = requests.get(f'{BASE_URL}/api/state') data = response.json() print(f" Status: {response.status_code}") print(f" Current text: {data.get('current_text', '')[:50]}...") assert response.status_code == 200 print(" PASS") print("\n3. POST /api/load_song (song 1)") response = requests.post( f'{BASE_URL}/api/load_song', json={'song_number': '1'} ) print(f" Status: {response.status_code}") time.sleep(0.5) response = requests.get(f'{BASE_URL}/api/state') state = response.json() print(f" Text loaded: {state.get('current_text', '')[:50]}...") assert 'Prva linija' in state.get('current_text', ''), "Song not loaded" print(" PASS") print("\n4. POST /api/toggle_caps") response = requests.post(f'{BASE_URL}/api/toggle_caps') print(f" Status: {response.status_code}") time.sleep(0.3) response = requests.get(f'{BASE_URL}/api/state') state = response.json() print(f" Caps mode: {state.get('caps_mode')}") print(f" Text (caps): {state.get('current_text', '')[:50]}...") print(" PASS") print("\n5. POST /api/clear_screen") response = requests.post(f'{BASE_URL}/api/clear_screen') print(f" Status: {response.status_code}") time.sleep(0.3) response = requests.get(f'{BASE_URL}/api/state') state = response.json() print(f" Pages cleared: {len(mock_app.pages) == 0}") print(f" Current text after clear: '{state.get('current_text')}'") assert state.get('current_text', '').startswith('Pripravljeno'), "Clear screen didn't update state" print(" PASS") print("\n6. POST /api/search_songs") response = requests.post( f'{BASE_URL}/api/search_songs', json={'query': 'pesem'} ) data = response.json() print(f" Status: {response.status_code}") print(f" Results: {data.get('results', [])}") print(" PASS") print("\n" + "=" * 60) print("ALL TESTS PASSED!") print("=" * 60) print(f"\nFlask server available at: http://127.0.0.1:{web_port}") except AssertionError as e: print(f" FAIL: {e}") sys.exit(1) except Exception as e: print(f" FAIL: {e}") import traceback traceback.print_exc() sys.exit(1)