Coverage for tests/model_tests/test_skills.py: 99%
385 statements
« prev ^ index » next coverage.py v7.8.0, created at 2025-05-05 14:02 +0000
« prev ^ index » next coverage.py v7.8.0, created at 2025-05-05 14:02 +0000
1"""Tests for the skills routes."""
3# pylint: disable=redefined-outer-name
4# flake8: noqa: F811
6import os
7import sys
8import uuid
9import pytest
10from dotenv import load_dotenv
12# Add the root directory to the Python path
13sys.path.append(
14 os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
15)
17from core import shared
18from core.database_mongo_manager import DatabaseMongoManager
20os.environ["IS_TEST"] = "True"
22load_dotenv()
25@pytest.fixture()
26def app():
27 """Fixture to create a test client."""
28 from ...app import app # pylint: disable=import-outside-toplevel
30 return app
33@pytest.fixture()
34def database():
35 """Fixture to create a test database."""
37 database = DatabaseMongoManager(
38 shared.getenv("MONGO_URI"), shared.getenv("MONGO_DB_TEST", "cs3528_testing")
39 )
40 skills = database.get_all("skills")
41 attempted_skills = database.get_all("attempted_skills")
42 database.delete_all("skills")
43 database.delete_all("attempted_skills")
44 yield database
46 for skill in skills:
47 database.insert("skills", skill)
48 for skill in attempted_skills:
49 database.insert("attempted_skills", skill)
50 database.delete_all_by_field("users", "email", "dummy@dummy.com")
51 database.delete_all_by_field("courses", "course_id", "CS101")
52 # Cleanup code
53 database.connection.close()
56@pytest.fixture()
57def skill_model():
58 """Fixture to create a Course model instance."""
59 from skills.models import Skill
61 return Skill()
64@pytest.fixture()
65def sample_skill(database):
66 """Fixture to create a sample course."""
67 yield {
68 "_id": uuid.uuid4().hex,
69 "skill_name": "Test Skill",
70 "skill_description": "Test Skill Description",
71 }
72 database.delete_all_by_field("skills", "skill_name", "Test Skill")
75def test_find_skill_by_id(database, sample_skill, app, skill_model):
76 """Test find_skill method by ID."""
78 database.insert("skills", sample_skill)
80 skill_id = sample_skill["_id"]
82 with app.app_context():
83 with app.test_request_context():
84 skill = skill_model.find_skill(None, skill_id)
85 assert skill["_id"] == sample_skill["_id"]
86 assert skill["skill_name"] == sample_skill["skill_name"]
87 assert skill["skill_description"] == sample_skill["skill_description"]
89 database.delete_all_by_field("skills", "skill_name", "Test Skill")
92def test_add_skill(database, skill_model, app):
93 """Test add_skill method."""
94 database.delete_all_by_field("skills", "skill_name", "New Skill")
96 sample_skill = {
97 "_id": uuid.uuid4().hex,
98 "skill_name": "New Skill",
99 "skill_description": "New Skill Description",
100 }
102 with app.app_context():
103 with app.test_request_context():
104 response = skill_model.add_skill(sample_skill)[0]
105 assert response.status_code == 200
106 assert database.get_one_by_id("skills", sample_skill["_id"]) is not None
108 database.delete_all_by_field("skills", "skill_name", "New Skill")
111def test_delete_skill(database, skill_model, app):
112 """Test delete_skill method."""
113 database.delete_all_by_field("skills", "skill_name", "Delete Skill")
114 sample_skill = {
115 "_id": uuid.uuid4().hex,
116 "skill_name": "Delete Skill",
117 "skill_description": "Skill to delete",
118 }
119 database.insert("skills", sample_skill)
121 with app.app_context():
122 with app.test_request_context():
123 response = skill_model.delete_skill(sample_skill["_id"])[0]
124 assert response.status_code == 200
125 assert database.get_one_by_id("skills", sample_skill["_id"]) is None
127 database.delete_all_by_field("skills", "skill_name", "Delete Skill")
130def test_get_skill_by_id(database, skill_model, app):
131 """Test get_skill_by_id method."""
132 database.delete_all_by_field("skills", "skill_name", "Find Skill")
133 sample_skill = {
134 "_id": uuid.uuid4().hex,
135 "skill_name": "Find Skill",
136 "skill_description": "Skill to find",
137 }
138 database.insert("skills", sample_skill)
140 with app.app_context():
141 with app.test_request_context():
142 skill = skill_model.get_skill_by_id(sample_skill["_id"])
143 assert skill is not None
144 assert skill["skill_name"] == "Find Skill"
146 database.delete_all_by_field("skills", "skill_name", "Find Skill")
149def test_get_skills(database, skill_model, app):
150 """Test get_skills method."""
151 sample_skill = {
152 "_id": uuid.uuid4().hex,
153 "skill_name": "List Skill",
154 "skill_description": "Skill in list",
155 }
156 database.insert("skills", sample_skill)
158 with app.app_context():
159 with app.test_request_context():
160 skills = skill_model.get_skills()
161 assert any(skill["skill_name"] == "List Skill" for skill in skills)
163 database.delete_all_by_field("skills", "skill_name", "List Skill")
166def test_update_skill(database, skill_model, app):
167 """Test update_skill method."""
168 database.delete_all_by_field("skills", "skill_name", "Updated Skill")
169 database.delete_all_by_field("skills", "skill_name", "Old Skill")
170 database.delete_all_by_field("skills", "skill_name", "Updated skill")
171 database.delete_all_by_field("skills", "skill_name", "Old skill")
172 sample_skill = {
173 "_id": uuid.uuid4().hex,
174 "skill_name": "Old Skill",
175 "skill_description": "Old description",
176 }
177 database.insert("skills", sample_skill)
179 with app.app_context():
180 with app.test_request_context():
181 response = skill_model.update_skill(
182 sample_skill["_id"], "Updated Skill", "Updated description"
183 )[0]
184 assert response.status_code == 200
185 updated_skill = database.get_one_by_id("skills", sample_skill["_id"])
186 assert updated_skill["skill_name"] == "Updated skill"
188 database.delete_all_by_field("skills", "skill_name", "Updated Skill")
191def test_attempt_add_skill(database, skill_model, app):
192 """Test attempt_add_skill method."""
193 database.delete_all_by_field("attempted_skills", "skill_name", "Attempted Skill")
194 with app.app_context():
195 with app.test_request_context():
196 response = skill_model.attempt_add_skill("Attempted Skill")[0]
197 assert response.status_code == 200
198 assert (
199 database.get_one_by_field(
200 "attempted_skills", "skill_name", "Attempted Skill"
201 )
202 is not None
203 )
205 database.delete_all_by_field("attempted_skills", "skill_name", "Attempted Skill")
208def test_approve_skill(database, skill_model, app):
209 """Test approve_skill method."""
210 database.delete_all_by_field("skills", "skill_name", "Approve Skill")
211 database.delete_all_by_field("attempted_skills", "skill_name", "Approve Skill")
212 database.delete_all_by_field("skills", "skill_name", "Approve skill")
213 attempted_skill = {
214 "_id": uuid.uuid4().hex,
215 "skill_name": "Approve Skill",
216 "used": 1,
217 }
218 database.insert("attempted_skills", attempted_skill)
220 with app.app_context():
221 with app.test_request_context():
222 response = skill_model.approve_skill(
223 attempted_skill["_id"], "Approved Description"
224 )[0]
225 assert response.status_code == 200
226 assert database.get_one_by_id("skills", attempted_skill["_id"]) is not None
228 database.delete_all_by_field("skills", "skill_name", "Approve Skill")
229 database.delete_all_by_field("attempted_skills", "skill_name", "Approve Skill")
230 database.delete_all_by_field("skills", "skill_name", "Approve skill")
233def test_reject_skill(database, skill_model, app):
234 """Test reject_skill method."""
235 database.delete_all_by_field("skills", "skill_name", "Reject Skill")
236 database.delete_all_by_field("attempted_skills", "skill_name", "Reject Skill")
237 attempted_skill = {
238 "_id": uuid.uuid4().hex,
239 "skill_name": "Reject Skill",
240 "used": 1,
241 }
242 database.insert("attempted_skills", attempted_skill)
244 with app.app_context():
245 with app.test_request_context():
246 response = skill_model.reject_skill(attempted_skill["_id"])[0]
247 assert response.status_code == 200
248 assert (
249 database.get_one_by_id("attempted_skills", attempted_skill["_id"])
250 is None
251 )
253 database.delete_all_by_field("attempted_skills", "skill_name", "Reject Skill")
256def test_update_skill_name_conflict(database, skill_model, app):
257 """Test update_skill method with name conflict."""
258 database.delete_all_by_field("skills", "skill_name", "Conflict Skill")
259 database.delete_all_by_field("skills", "skill_name", "Existing Skill")
261 existing_skill = {
262 "_id": uuid.uuid4().hex,
263 "skill_name": "Existing Skill",
264 "skill_description": "Existing description",
265 }
266 database.insert("skills", existing_skill)
268 sample_skill = {
269 "_id": uuid.uuid4().hex,
270 "skill_name": "Conflict Skill",
271 "skill_description": "Conflict description",
272 }
273 database.insert("skills", sample_skill)
275 with app.app_context():
276 with app.test_request_context():
277 response = skill_model.update_skill(
278 sample_skill["_id"], "Existing Skill", "Updated description"
279 )
280 assert response[1] == 400
281 assert response[0].json["error"] == "Skill name already in use"
283 database.delete_all_by_field("skills", "skill_name", "Conflict Skill")
284 database.delete_all_by_field("skills", "skill_name", "Existing Skill")
287def test_update_invalid_skill(database, skill_model, app, sample_skill):
288 """Test update_skill method with invalid skill."""
289 with app.app_context():
290 with app.test_request_context():
291 response = skill_model.update_skill(
292 sample_skill["_id"], "Updated Skill", "Updated description"
293 )
294 assert response[1] == 404
295 assert response[0].json["error"] == "Skill not found"
297 database.delete_all_by_field("skills", "skill_name", "Invalid Skill")
300def test_find_skill_return_none(skill_model, app):
301 """Test find_skill method returns None for non-existent skill."""
302 with app.app_context():
303 with app.test_request_context():
304 skill = skill_model.find_skill(skill_name="NonExistentSkill")
305 assert skill is None
307 skill = skill_model.find_skill(skill_id="nonexistentid")
308 assert skill is None
311def test_add_existing_skill(database, skill_model, app):
312 """Test add_skill method with existing skill."""
313 database.delete_all_by_field("skills", "skill_name", "Existing Skill")
315 existing_skill = {
316 "_id": uuid.uuid4().hex,
317 "skill_name": "Existing Skill",
318 "skill_description": "Existing description",
319 }
320 database.insert("skills", existing_skill)
322 with app.app_context():
323 with app.test_request_context():
324 response = skill_model.add_skill(existing_skill)
325 assert response[1] == 400
326 assert response[0].json["error"] == "Skill already in database"
328 database.delete_all_by_field("skills", "skill_name", "Existing Skill")
331def test_delete_skill_with_students(database, skill_model, app):
332 """Test delete_skill method with students having the skill."""
333 database.delete_all_by_field("skills", "skill_name", "Skill to Delete")
334 database.delete_all_by_field("students", "email", "student@example.com")
336 sample_skill = {
337 "_id": uuid.uuid4().hex,
338 "skill_name": "Skill to Delete",
339 "skill_description": "Skill to be deleted",
340 }
341 database.insert("skills", sample_skill)
343 sample_student = {
344 "_id": uuid.uuid4().hex,
345 "email": "student@example.com",
346 "skills": [sample_skill["_id"]],
347 }
348 database.insert("students", sample_student)
350 with app.app_context():
351 with app.test_request_context():
352 response = skill_model.delete_skill(sample_skill["_id"])[0]
353 assert response.status_code == 200
354 assert database.get_one_by_id("skills", sample_skill["_id"]) is None
355 updated_student = database.get_one_by_id("students", sample_student["_id"])
356 assert sample_skill["_id"] not in updated_student["skills"]
358 database.delete_all_by_field("skills", "skill_name", "Skill to Delete")
359 database.delete_all_by_field("students", "email", "student@example.com")
362def test_delete_nonexistent_skill(skill_model, app):
363 """Test delete_skill method with non-existent skill."""
364 with app.app_context():
365 with app.test_request_context():
366 response = skill_model.delete_skill("nonexistentid")
367 assert response[1] == 404
368 assert response[0].json["error"] == "Skill not found"
371def test_get_skill_by_id_returns_none(skill_model, app):
372 """Test get_skill_by_id method returns None for non-existent skill."""
373 with app.app_context():
374 with app.test_request_context():
375 skill = skill_model.get_skill_by_id("nonexistentid")
376 assert skill is None
379def test_get_skill_name_by_id(database, skill_model, app):
380 """Test get_skill_name_by_id method."""
381 database.delete_all_by_field("skills", "skill_name", "Skill Name")
382 sample_skill = {
383 "_id": uuid.uuid4().hex,
384 "skill_name": "Skill Name",
385 "skill_description": "Skill Description",
386 }
387 database.insert("skills", sample_skill)
389 with app.app_context():
390 with app.test_request_context():
391 skill_name = skill_model.get_skill_name_by_id(sample_skill["_id"])
392 assert skill_name == "Skill Name"
394 skill_name = skill_model.get_skill_name_by_id("nonexistentid")
395 assert skill_name is None
397 database.delete_all_by_field("skills", "skill_name", "Skill Name")
400def test_get_skills_map(database, skill_model, app):
401 """Test get_skills_map method."""
402 database.delete_all_by_field("skills", "skill_name", "Skill 1")
403 database.delete_all_by_field("skills", "skill_name", "Skill 2")
404 sample_skill_1 = {
405 "_id": uuid.uuid4().hex,
406 "skill_name": "Skill 1",
407 "skill_description": "Description 1",
408 }
409 sample_skill_2 = {
410 "_id": uuid.uuid4().hex,
411 "skill_name": "Skill 2",
412 "skill_description": "Description 2",
413 }
414 database.insert("skills", sample_skill_1)
415 database.insert("skills", sample_skill_2)
417 with app.app_context():
418 with app.test_request_context():
419 skills_map = skill_model.get_skills_map()
420 assert sample_skill_1["_id"] in skills_map
421 assert sample_skill_2["_id"] in skills_map
422 assert skills_map[sample_skill_1["_id"]]["skill_name"] == "Skill 1"
423 assert skills_map[sample_skill_2["_id"]]["skill_name"] == "Skill 2"
425 database.delete_all_by_field("skills", "skill_name", "Skill 1")
426 database.delete_all_by_field("skills", "skill_name", "Skill 2")
429def test_attempt_add_existing_skill(database, skill_model, app):
430 """Test attempt_add_skill method with existing skill."""
431 database.delete_all_by_field(
432 "attempted_skills", "skill_name", "Existing Attempted Skill"
433 )
434 existing_skill = {
435 "_id": uuid.uuid4().hex,
436 "skill_name": "Existing Attempted Skill",
437 "used": 1,
438 }
439 database.insert("attempted_skills", existing_skill)
441 with app.app_context():
442 with app.test_request_context():
443 response = skill_model.attempt_add_skill("Existing Attempted Skill")[0]
444 assert response.status_code == 200
445 updated_skill = database.get_one_by_field(
446 "attempted_skills", "skill_name", "Existing Attempted Skill"
447 )
448 assert updated_skill["used"] == 2
450 database.delete_all_by_field(
451 "attempted_skills", "skill_name", "Existing Attempted Skill"
452 )
455def test_get_list_attempted_skills(database, skill_model, app):
456 """Test get_list_attempted_skills method."""
457 current_attempted_skills = database.get_all("attempted_skills")
458 database.delete_all("attempted_skills")
460 database.delete_all_by_field("attempted_skills", "skill_name", "Attempted Skill 1")
461 database.delete_all_by_field("attempted_skills", "skill_name", "Attempted Skill 2")
463 sample_skill_1 = {
464 "_id": uuid.uuid4().hex,
465 "skill_name": "Attempted Skill 1",
466 "used": 1,
467 }
468 sample_skill_2 = {
469 "_id": uuid.uuid4().hex,
470 "skill_name": "Attempted Skill 2",
471 "used": 1,
472 }
473 database.insert("attempted_skills", sample_skill_1)
474 database.insert("attempted_skills", sample_skill_2)
476 with app.app_context():
477 with app.test_request_context():
478 attempted_skills = skill_model.get_list_attempted_skills()
479 assert len(attempted_skills) == 2
480 assert any(
481 skill["skill_name"] == "Attempted Skill 1" for skill in attempted_skills
482 )
483 assert any(
484 skill["skill_name"] == "Attempted Skill 2" for skill in attempted_skills
485 )
487 database.delete_all_by_field("attempted_skills", "skill_name", "Attempted Skill 1")
488 database.delete_all_by_field("attempted_skills", "skill_name", "Attempted Skill 2")
490 for skill in current_attempted_skills:
491 database.insert("attempted_skills", skill)
494def test_get_attempted_skill_success(database, skill_model, app):
495 """Test get_attempted_skill method success."""
496 database.delete_all_by_field("attempted_skills", "skill_name", "Attempted Skill")
497 sample_skill = {
498 "_id": uuid.uuid4().hex,
499 "skill_name": "Attempted Skill",
500 "used": 1,
501 }
502 database.insert("attempted_skills", sample_skill)
504 with app.app_context():
505 with app.test_request_context():
506 skill = skill_model.get_attempted_skill(sample_skill["_id"])
507 assert skill is not None
508 assert skill["skill_name"] == "Attempted Skill"
510 database.delete_all_by_field("attempted_skills", "skill_name", "Attempted Skill")
513def test_get_attempted_skill_failure(skill_model, app):
514 """Test get_attempted_skill method failure."""
515 with app.app_context():
516 with app.test_request_context():
517 skill = skill_model.get_attempted_skill("nonexistentid")
518 assert skill is None
521def test_approve_skill_updates_students(database, skill_model, app):
522 """Test approve_skill method updates students."""
523 database.delete_all_by_field("skills", "skill_name", "Approve Skill")
524 database.delete_all_by_field("attempted_skills", "skill_name", "Approve Skill")
525 database.delete_all_by_field("students", "email", "student@example.com")
527 attempted_skill = {
528 "_id": uuid.uuid4().hex,
529 "skill_name": "Approve Skill",
530 "used": 1,
531 }
532 database.insert("attempted_skills", attempted_skill)
534 sample_student = {
535 "_id": uuid.uuid4().hex,
536 "email": "student@example.com",
537 "skills": [],
538 "attempted_skills": [attempted_skill["_id"]],
539 }
540 database.insert("students", sample_student)
542 with app.app_context():
543 with app.test_request_context():
544 response = skill_model.approve_skill(
545 attempted_skill["_id"], "Approved Description"
546 )[0]
547 assert response.status_code == 200
548 assert database.get_one_by_id("skills", attempted_skill["_id"]) is not None
550 updated_student = database.get_one_by_id("students", sample_student["_id"])
551 assert attempted_skill["_id"] in updated_student["skills"]
552 assert attempted_skill["_id"] not in updated_student["attempted_skills"]
554 database.delete_all_by_field("skills", "skill_name", "Approve Skill")
555 database.delete_all_by_field("attempted_skills", "skill_name", "Approve Skill")
556 database.delete_all_by_field("students", "email", "student@example.com")
559def test_approve_skill_empty_description(database, skill_model, app):
560 """Test approve_skill method with empty description."""
561 database.delete_all_by_field("attempted_skills", "skill_name", "Approve Skill")
562 attempted_skill = {
563 "_id": uuid.uuid4().hex,
564 "skill_name": "Approve Skill",
565 "used": 1,
566 }
567 database.insert("attempted_skills", attempted_skill)
569 with app.app_context():
570 with app.test_request_context():
571 response = skill_model.approve_skill(attempted_skill["_id"], "")
572 assert response[1] == 400
573 assert response[0].json["error"] == "Description is empty"
575 database.delete_all_by_field("attempted_skills", "skill_name", "Approve Skill")
578def test_approve_nonexistent_skill(skill_model, app):
579 """Test approve_skill method with non-existent skill."""
580 with app.app_context():
581 with app.test_request_context():
582 response = skill_model.approve_skill("nonexistentid", "Description")
583 assert response[1] == 404
584 assert response[0].json["error"] == "Attempted skill not found"
587def test_reject_skill_updates_students(database, skill_model, app):
588 """Test reject_skill method updates students."""
589 database.delete_all_by_field("attempted_skills", "skill_name", "Reject Skill")
590 database.delete_all_by_field("students", "email", "student@example.com")
592 attempted_skill = {
593 "_id": uuid.uuid4().hex,
594 "skill_name": "Reject Skill",
595 "used": 1,
596 }
597 database.insert("attempted_skills", attempted_skill)
599 sample_student = {
600 "_id": uuid.uuid4().hex,
601 "email": "student@example.com",
602 "skills": [],
603 "attempted_skills": [attempted_skill["_id"]],
604 }
605 database.insert("students", sample_student)
607 with app.app_context():
608 with app.test_request_context():
609 response = skill_model.reject_skill(attempted_skill["_id"])[0]
610 assert response.status_code == 200
611 assert (
612 database.get_one_by_id("attempted_skills", attempted_skill["_id"])
613 is None
614 )
616 updated_student = database.get_one_by_id("students", sample_student["_id"])
617 assert attempted_skill["_id"] not in updated_student["attempted_skills"]
619 database.delete_all_by_field("attempted_skills", "skill_name", "Reject Skill")
620 database.delete_all_by_field("students", "email", "student@example.com")
623def test_reject_nonexistent_skill(skill_model, app):
624 """Test reject_skill method with non-existent skill."""
625 with app.app_context():
626 with app.test_request_context():
627 response = skill_model.reject_skill("nonexistentid")
628 assert response[1] == 404
629 assert response[0].json["error"] == "Attempted skill not found"
632def test_update_attempt_skill(database, skill_model, app):
633 """Test update_attempt_skill method."""
634 database.delete_all_by_field("attempted_skills", "skill_name", "Attempted Skill")
635 sample_skill = {
636 "_id": uuid.uuid4().hex,
637 "skill_name": "Attempted Skill",
638 "skill_description": "Old Description",
639 }
640 database.insert("attempted_skills", sample_skill)
642 with app.app_context():
643 with app.test_request_context():
644 response = skill_model.update_attempt_skill(
645 sample_skill["_id"], "Updated Skill", "Updated Description"
646 )[0]
647 assert response.status_code == 200
648 updated_skill = database.get_one_by_id(
649 "attempted_skills", sample_skill["_id"]
650 )
651 assert updated_skill["skill_name"] == "Updated Skill"
652 assert updated_skill["skill_description"] == "Updated Description"
654 database.delete_all_by_field("attempted_skills", "skill_name", "Updated Skill")
657def test_update_attempt_skill_invalid_id(skill_model, app):
658 """Test update_attempt_skill method with invalid skill ID."""
659 with app.app_context():
660 with app.test_request_context():
661 response = skill_model.update_attempt_skill(
662 "nonexistentid", "Updated Skill", "Updated Description"
663 )
664 assert response[1] == 404
665 assert response[0].json["error"] == "Skill not found"
668def test_delete_all_attempted_skills(database, skill_model, app):
669 """Test delete_all_attempted_skill method."""
670 database.insert(
671 "attempted_skills",
672 {"_id": uuid.uuid4().hex, "skill_name": "Test Attempted Skill"},
673 )
675 with app.app_context():
676 with app.test_request_context():
677 response = skill_model.delete_all_attempted_skill()[0]
678 assert response.status_code == 200
679 assert database.get_all("attempted_skills") == []
682def test_upload_skills(database, skill_model, app):
683 """Test upload_skills method with a valid file."""
684 import pandas as pd
685 from io import BytesIO
687 data = {
688 "Skill_Name": ["Uploaded Skill 1", "Uploaded Skill 2"],
689 "Skill_Description": ["Desc 1", "Desc 2"],
690 }
691 df = pd.DataFrame(data)
692 file = BytesIO()
693 df.to_excel(file, index=False)
694 file.seek(0)
695 file.name = "skills.xlsx"
697 with app.app_context():
698 with app.test_request_context():
699 response = skill_model.upload_skills(file)[0]
700 assert response.status_code == 200
701 assert (
702 database.get_one_by_field("skills", "skill_name", "Uploaded Skill 1")
703 is not None
704 )
705 assert (
706 database.get_one_by_field("skills", "skill_name", "Uploaded Skill 2")
707 is not None
708 )
710 database.delete_all_by_field("skills", "skill_name", "Uploaded Skill 1")
711 database.delete_all_by_field("skills", "skill_name", "Uploaded Skill 2")
714def test_download_all(database, skill_model, app):
715 """Test download_all method."""
716 database.insert(
717 "skills",
718 {
719 "_id": uuid.uuid4().hex,
720 "skill_name": "Downloadable Skill",
721 "skill_description": "Desc",
722 },
723 )
725 with app.app_context():
726 with app.test_request_context():
727 response = skill_model.download_all()
728 assert response.status_code == 200
729 assert (
730 response.mimetype
731 == "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
732 )
734 database.delete_all_by_field("skills", "skill_name", "Downloadable Skill")
737def test_find_skill_returns_none(skill_model, app):
738 """Test find_skill method returns None for non-existent skill."""
739 with app.app_context():
740 with app.test_request_context():
741 assert skill_model.find_skill(skill_name="NonExistent") is None
742 assert skill_model.find_skill(skill_id="nonexistentid") is None
745def test_get_list_attempted_skills_empty(database, skill_model, app):
746 """Test get_list_attempted_skills returns an empty list when no attempted skills exist."""
747 database.delete_all("attempted_skills")
749 with app.app_context():
750 with app.test_request_context():
751 assert skill_model.get_list_attempted_skills() == []