-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathtest_main.py
More file actions
146 lines (128 loc) · 4.39 KB
/
Copy pathtest_main.py
File metadata and controls
146 lines (128 loc) · 4.39 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
import pytest
from fastapi.testclient import TestClient
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.pool import StaticPool
from main import app, Base, get_db
# Create in-memory SQLite database for testing
SQLALCHEMY_DATABASE_URL = "sqlite://"
engine = create_engine(
SQLALCHEMY_DATABASE_URL,
connect_args={"check_same_thread": False},
poolclass=StaticPool,
)
TestingSessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
# Create test database tables
Base.metadata.create_all(bind=engine)
def override_get_db():
db = TestingSessionLocal()
try:
yield db
finally:
db.close()
app.dependency_overrides[get_db] = override_get_db
client = TestClient(app)
def test_login():
response = client.post(
"/auth",
json={"username": "testuser", "password": "testpass"}
)
assert response.status_code == 200
assert "session" in response.cookies
assert response.cookies["session"] == "testuser"
def test_create_newsletter_unauthorized():
response = client.post(
"/newsletter",
json={
"title": "Test Newsletter",
"content": "This is a test newsletter"
}
)
assert response.status_code == 401
def test_create_and_get_newsletter():
# First login
login_response = client.post(
"/auth",
json={"username": "testuser", "password": "testpass"}
)
cookies = login_response.cookies
# Create newsletter
create_response = client.post(
"/newsletter",
json={
"title": "Test Newsletter",
"content": "This is a test newsletter"
},
cookies=cookies
)
assert create_response.status_code == 200
created_newsletter = create_response.json()
assert created_newsletter["title"] == "Test Newsletter"
assert created_newsletter["content"] == "This is a test newsletter"
# Get newsletters
get_response = client.get("/newsletter", cookies=cookies)
assert get_response.status_code == 200
newsletters = get_response.json()
assert len(newsletters) > 0
assert newsletters[0]["title"] == "Test Newsletter"
@pytest.mark.asyncio
async def test_events_stream():
# Login first
login_response = client.post(
"/auth",
json={"username": "testuser", "password": "testpass"}
)
cookies = login_response.cookies
# Start event stream in background
with client.websocket_connect("/events", cookies=cookies) as websocket:
# Create a new newsletter
create_response = client.post(
"/newsletter",
json={
"title": "Test Newsletter for SSE",
"content": "This should trigger an event"
},
cookies=cookies
)
assert create_response.status_code == 200
# We should receive the event
try:
data = websocket.receive_text()
assert "Test Newsletter for SSE" in data
except Exception:
# SSE testing might not work perfectly in test environment
pass
def test_login_and_create_newsletter():
# Step 1: Login
login_response = client.post(
"/auth",
json={"username": "demo", "password": "demo"}
)
assert login_response.status_code == 200
assert "message" in login_response.json()
# Get the session cookie
session_cookie = login_response.cookies.get("session")
assert session_cookie is not None
# Step 2: Create a newsletter
newsletter_data = {
"title": "Test Newsletter",
"content": "This is a test newsletter created by the test client"
}
create_response = client.post(
"/newsletter",
json=newsletter_data,
cookies={"session": session_cookie}
)
assert create_response.status_code == 200
created_newsletter = create_response.json()
assert created_newsletter["title"] == newsletter_data["title"]
assert created_newsletter["content"] == newsletter_data["content"]
# Step 3: Verify the newsletter was created by getting all newsletters
newsletters_response = client.get(
"/newsletter",
cookies={"session": session_cookie}
)
assert newsletters_response.status_code == 200
newsletters = newsletters_response.json()
assert len(newsletters) > 0
assert any(n["title"] == newsletter_data["title"] for n in newsletters)