Prva verzija mini web serverja (flask). Hvala, Github Copilot.
This commit is contained in:
185
tests/test_integration.py
Normal file
185
tests/test_integration.py
Normal file
@@ -0,0 +1,185 @@
|
||||
#!/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)
|
||||
Reference in New Issue
Block a user