215 lines
7.8 KiB
Python
215 lines
7.8 KiB
Python
"""
|
|||
|
|
Tests for data storage (YAML files and file system operations).
|
||
|
|
"""
|
||
|
|
import pytest
|
||
|
|
import os
|
||
|
|
import yaml
|
||
|
|
from pathlib import Path
|
||
|
|
from app import (
|
||
|
|
save_application_data,
|
||
|
|
load_application_data,
|
||
|
|
get_application_path,
|
||
|
|
get_data_file_path,
|
||
|
|
get_attachments_path
|
||
|
|
)
|
||
|
|
|
||
|
|
|
||
|
|
class TestYAMLStorage:
|
||
|
|
"""Tests for YAML data storage."""
|
||
|
|
|
||
|
|
def test_save_application_data(self, app, sample_application_data):
|
||
|
|
"""Test saving application data to YAML file."""
|
||
|
|
session_id = sample_application_data['session_id']
|
||
|
|
save_application_data(session_id, sample_application_data)
|
||
|
|
|
||
|
|
# Verify file was created
|
||
|
|
data_file = get_data_file_path(session_id)
|
||
|
|
assert os.path.exists(data_file)
|
||
|
|
|
||
|
|
# Verify content
|
||
|
|
with open(data_file, 'r', encoding='utf-8') as f:
|
||
|
|
loaded_data = yaml.safe_load(f)
|
||
|
|
|
||
|
|
assert loaded_data['session_id'] == session_id
|
||
|
|
assert loaded_data['email'] == sample_application_data['email']
|
||
|
|
assert loaded_data['job_name'] == sample_application_data['job_name']
|
||
|
|
|
||
|
|
def test_load_application_data(self, app, sample_application_data):
|
||
|
|
"""Test loading application data from YAML file."""
|
||
|
|
session_id = sample_application_data['session_id']
|
||
|
|
|
||
|
|
# Save data first
|
||
|
|
save_application_data(session_id, sample_application_data)
|
||
|
|
|
||
|
|
# Load and verify
|
||
|
|
loaded_data = load_application_data(session_id)
|
||
|
|
assert loaded_data is not None
|
||
|
|
assert loaded_data['session_id'] == session_id
|
||
|
|
assert loaded_data['email'] == sample_application_data['email']
|
||
|
|
assert loaded_data['personal_info']['name'] == 'Müller'
|
||
|
|
|
||
|
|
def test_load_nonexistent_application(self, app):
|
||
|
|
"""Test loading data for non-existent application."""
|
||
|
|
loaded_data = load_application_data('nonexistent-session')
|
||
|
|
assert loaded_data is None
|
||
|
|
|
||
|
|
def test_unicode_characters_in_yaml(self, app):
|
||
|
|
"""Test that German umlauts and special characters are preserved."""
|
||
|
|
session_id = 'test-unicode-123'
|
||
|
|
data = {
|
||
|
|
'session_id': session_id,
|
||
|
|
'email': 'test@example.com',
|
||
|
|
'job_name': 'Test Job',
|
||
|
|
'current_page': 2,
|
||
|
|
'personal_info': {
|
||
|
|
'name': 'Müller',
|
||
|
|
'firstname': 'Jürgen',
|
||
|
|
'city': 'München',
|
||
|
|
'notes': 'Grüße aus Zürich'
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
save_application_data(session_id, data)
|
||
|
|
loaded_data = load_application_data(session_id)
|
||
|
|
|
||
|
|
assert loaded_data['personal_info']['name'] == 'Müller'
|
||
|
|
assert loaded_data['personal_info']['firstname'] == 'Jürgen'
|
||
|
|
assert loaded_data['personal_info']['city'] == 'München'
|
||
|
|
assert loaded_data['personal_info']['notes'] == 'Grüße aus Zürich'
|
||
|
|
|
||
|
|
def test_update_existing_application(self, app, sample_application_data):
|
||
|
|
"""Test updating existing application data."""
|
||
|
|
session_id = sample_application_data['session_id']
|
||
|
|
|
||
|
|
# Save initial data
|
||
|
|
save_application_data(session_id, sample_application_data)
|
||
|
|
|
||
|
|
# Update data
|
||
|
|
sample_application_data['current_page'] = 3
|
||
|
|
sample_application_data['motivation_answers'] = {
|
||
|
|
'current_job': 'Developer',
|
||
|
|
'motivation': 'Great company'
|
||
|
|
}
|
||
|
|
save_application_data(session_id, sample_application_data)
|
||
|
|
|
||
|
|
# Verify update
|
||
|
|
loaded_data = load_application_data(session_id)
|
||
|
|
assert loaded_data['current_page'] == 3
|
||
|
|
assert 'motivation_answers' in loaded_data
|
||
|
|
assert loaded_data['motivation_answers']['current_job'] == 'Developer'
|
||
|
|
|
||
|
|
|
||
|
|
class TestFolderStructure:
|
||
|
|
"""Tests for application folder structure."""
|
||
|
|
|
||
|
|
def test_application_folder_created(self, app, sample_application_data):
|
||
|
|
"""Test that application folder is created when saving data."""
|
||
|
|
session_id = sample_application_data['session_id']
|
||
|
|
save_application_data(session_id, sample_application_data)
|
||
|
|
|
||
|
|
app_path = get_application_path(session_id)
|
||
|
|
assert os.path.exists(app_path)
|
||
|
|
assert os.path.isdir(app_path)
|
||
|
|
|
||
|
|
def test_data_yaml_created(self, app, sample_application_data):
|
||
|
|
"""Test that data.yaml file is created."""
|
||
|
|
session_id = sample_application_data['session_id']
|
||
|
|
save_application_data(session_id, sample_application_data)
|
||
|
|
|
||
|
|
data_file = get_data_file_path(session_id)
|
||
|
|
assert os.path.exists(data_file)
|
||
|
|
assert os.path.isfile(data_file)
|
||
|
|
assert data_file.endswith('data.yaml')
|
||
|
|
|
||
|
|
def test_attachments_folder_path(self, app):
|
||
|
|
"""Test that attachments folder path is correct."""
|
||
|
|
session_id = 'test-attachments-123'
|
||
|
|
attachments_path = get_attachments_path(session_id)
|
||
|
|
|
||
|
|
assert 'attachments' in attachments_path
|
||
|
|
assert session_id in attachments_path
|
||
|
|
|
||
|
|
|
||
|
|
class TestDataPersistence:
|
||
|
|
"""Tests for data persistence across workflow."""
|
||
|
|
|
||
|
|
def test_data_persists_across_pages(self, app, client):
|
||
|
|
"""Test that data persists as user progresses through pages."""
|
||
|
|
# Submit email
|
||
|
|
response = client.post('/apply/submit-email', data={
|
||
|
|
'email': 'persist@example.com',
|
||
|
|
'job_name': 'Persistence Test'
|
||
|
|
}, follow_redirects=True)
|
||
|
|
|
||
|
|
# Extract session ID from response
|
||
|
|
# For testing, we'll create a known session
|
||
|
|
from app import save_application_data
|
||
|
|
session_id = 'test-persist-123'
|
||
|
|
save_application_data(session_id, {
|
||
|
|
'session_id': session_id,
|
||
|
|
'email': 'persist@example.com',
|
||
|
|
'job_name': 'Persistence Test',
|
||
|
|
'current_page': 2,
|
||
|
|
'personal_info': {},
|
||
|
|
'motivation_answers': {},
|
||
|
|
'uploaded_files': []
|
||
|
|
})
|
||
|
|
|
||
|
|
# Submit personal info
|
||
|
|
client.post(f'/apply/{session_id}/submit-personal', data={
|
||
|
|
'name': 'Test',
|
||
|
|
'firstname': 'User',
|
||
|
|
'address': 'Street 1',
|
||
|
|
'zip_code': '12345',
|
||
|
|
'city': 'City',
|
||
|
|
'phone': '+41 79 123 45 67',
|
||
|
|
'birth_year': '1990'
|
||
|
|
})
|
||
|
|
|
||
|
|
# Load and verify personal info was saved
|
||
|
|
loaded_data = load_application_data(session_id)
|
||
|
|
assert loaded_data is not None
|
||
|
|
assert loaded_data['personal_info']['name'] == 'Test'
|
||
|
|
assert loaded_data['personal_info']['firstname'] == 'User'
|
||
|
|
assert loaded_data['current_page'] == 3 # Should be updated
|
||
|
|
|
||
|
|
# Submit motivation
|
||
|
|
client.post(f'/apply/{session_id}/submit-motivation', data={
|
||
|
|
'current_job': 'Developer',
|
||
|
|
'motivation': 'Love coding',
|
||
|
|
'qualifications': 'Python expert',
|
||
|
|
'salary': '100000'
|
||
|
|
})
|
||
|
|
|
||
|
|
# Load and verify motivation was saved
|
||
|
|
loaded_data = load_application_data(session_id)
|
||
|
|
assert loaded_data['motivation_answers']['current_job'] == 'Developer'
|
||
|
|
assert loaded_data['motivation_answers']['motivation'] == 'Love coding'
|
||
|
|
assert loaded_data['current_page'] == 4
|
||
|
|
|
||
|
|
def test_empty_optional_fields_preserved(self, app):
|
||
|
|
"""Test that empty optional fields are preserved correctly."""
|
||
|
|
session_id = 'test-empty-fields'
|
||
|
|
data = {
|
||
|
|
'session_id': session_id,
|
||
|
|
'email': 'test@example.com',
|
||
|
|
'job_name': 'Test',
|
||
|
|
'current_page': 3,
|
||
|
|
'personal_info': {
|
||
|
|
'civil_status': '' # Optional, empty
|
||
|
|
},
|
||
|
|
'motivation_answers': {
|
||
|
|
'current_job': '', # Optional, empty
|
||
|
|
'motivation': 'Some text',
|
||
|
|
'qualifications': '',
|
||
|
|
'salary': ''
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
save_application_data(session_id, data)
|
||
|
|
loaded_data = load_application_data(session_id)
|
||
|
|
|
||
|
|
assert loaded_data['personal_info']['civil_status'] == ''
|
||
|
|
assert loaded_data['motivation_answers']['current_job'] == ''
|
||
|
|
assert loaded_data['motivation_answers']['motivation'] == 'Some text'
|