Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[TO MAIN] DESENG-509 - Language model and API #2404

Merged
merged 12 commits into from
Mar 4, 2024
Merged
Prev Previous commit
Next Next commit
DESENG-509: Unit test for Language api
ratheesh-aot committed Feb 29, 2024
commit 7325f9ead95163d2ad8949f4e0dbaf87936e6543
108 changes: 108 additions & 0 deletions met-api/tests/unit/api/test_language.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
# Copyright © 2019 Province of British Columbia
#
# Licensed under the Apache License, Version 2.0 (the "License");
# ...

"""Tests to verify the Language API endpoints.

Test-Suite to ensure that the Language API endpoints are working as expected.
"""
import json
from http import HTTPStatus

from faker import Faker
from met_api.utils.enums import ContentType
from tests.utilities.factory_utils import factory_auth_header, factory_language_model

fake = Faker()


def test_get_language(client, jwt, session):
"""Assert that the get language by ID API endpoint is working as expected."""
headers = factory_auth_header(jwt=jwt, claims={})
language = factory_language_model({'name': 'French', 'code': 'fr', 'right_to_left': False})
session.add(language)
session.commit()

rv = client.get(
f'/api/languages/{language.id}',
headers=headers,
content_type=ContentType.JSON.value,
)

assert rv.status_code == HTTPStatus.OK
json_data = rv.json
assert json_data['name'] == 'French'


def test_get_languages(client, jwt, session):
"""Assert that the get all languages API endpoint is working as expected."""
headers = factory_auth_header(jwt=jwt, claims={})
factory_language_model({'name': 'German', 'code': 'de', 'right_to_left': False})
session.commit()

rv = client.get(
'/api/languages/',
headers=headers,
content_type=ContentType.JSON.value,
)

assert rv.status_code == HTTPStatus.OK
json_data = rv.json
assert len(json_data) > 0


def test_create_language(client, jwt, session, setup_admin_user_and_claims):
"""Assert that a new language can be created using the POST API endpoint."""
_, claims = setup_admin_user_and_claims
headers = factory_auth_header(jwt=jwt, claims=claims)
data = {'name': 'Italian', 'code': 'it', 'right_to_left': False}

rv = client.post(
'/api/languages/',
data=json.dumps(data),
headers=headers,
content_type=ContentType.JSON.value,
)

assert rv.status_code == HTTPStatus.CREATED
json_data = rv.json
assert json_data['name'] == 'Italian'


def test_update_language(client, jwt, session, setup_admin_user_and_claims):
"""Assert that a language can be updated using the PATCH API endpoint."""
_, claims = setup_admin_user_and_claims
headers = factory_auth_header(jwt=jwt, claims=claims)
language = factory_language_model({'name': 'Japanese', 'code': 'jp', 'right_to_left': True})
session.add(language)
session.commit()

data = {'name': 'Nihongo', 'right_to_left': False}
rv = client.patch(
f'/api/languages/{language.id}',
data=json.dumps(data),
headers=headers,
content_type=ContentType.JSON.value,
)

assert rv.status_code == HTTPStatus.OK
json_data = rv.json
assert json_data['name'] == 'Nihongo'


def test_delete_language(client, jwt, session, setup_admin_user_and_claims):
"""Assert that a language can be deleted using the DELETE API endpoint."""
_, claims = setup_admin_user_and_claims
headers = factory_auth_header(jwt=jwt, claims=claims)
language = factory_language_model({'name': 'Russian', 'code': 'ru', 'right_to_left': False})
session.add(language)
session.commit()

rv = client.delete(
f'/api/languages/{language.id}',
headers=headers,
content_type=ContentType.JSON.value,
)

assert rv.status_code == HTTPStatus.NO_CONTENT
65 changes: 65 additions & 0 deletions met-api/tests/unit/models/test_language.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
# Copyright © 2019 Province of British Columbia
#
# Licensed under the Apache License, Version 2.0 (the "License");
# ...

"""Tests for the Language model.

Test suite to ensure that the Language model routines are working as expected.
"""

from met_api.models.language import Language
from tests.utilities.factory_utils import factory_language_model


def test_create_language(session):
"""Assert that a language can be created."""
language_data = {'name': 'Spanish', 'code': 'es', 'right_to_left': False}
language = factory_language_model(language_data)
session.add(language)
session.commit()

assert language.id is not None
assert language.name == 'Spanish'


def test_get_language_by_id(session):
"""Assert that a language can be fetched by its ID."""
language = factory_language_model(
{'name': 'French', 'code': 'fr', 'right_to_left': False}
)
session.add(language)
session.commit()

fetched_language = Language.find_by_id(language.id)
assert fetched_language.id == language.id
assert fetched_language.name == 'French'


def test_update_language(session):
"""Assert that a language can be updated."""
language = factory_language_model(
{'name': 'German', 'code': 'de', 'right_to_left': False}
)
session.add(language)
session.commit()

updated_data = {'name': 'Deutsch', 'right_to_left': False}
Language.update_language(language.id, updated_data)
updated_language = Language.query.get(language.id)

assert updated_language.name == 'Deutsch'


def test_delete_language(session):
"""Assert that a language can be deleted."""
language = factory_language_model(
{'name': 'Italian', 'code': 'it', 'right_to_left': False}
)
session.add(language)
session.commit()

Language.delete_language(language.id)
deleted_language = Language.query.get(language.id)

assert deleted_language is None
81 changes: 81 additions & 0 deletions met-api/tests/unit/services/test_language_service.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
# Copyright © 2019 Province of British Columbia
#
# Licensed under the Apache License, Version 2.0 (the "License");
# ...

"""Tests for the LanguageService.

Test suite to ensure that the LanguageService routines are working as expected.
"""

from met_api.models.language import Language
from met_api.services.language_service import LanguageService
from tests.utilities.factory_utils import factory_language_model


def test_get_language_by_id(session):
"""Assert that a language can be fetched by its ID."""
language = factory_language_model(
{'name': 'French', 'code': 'fr', 'right_to_left': False}
)
session.add(language)
session.commit()

fetched_language = LanguageService.get_language_by_id(language.id)
assert fetched_language['name'] == 'French'


def test_get_languages(session):
"""Assert that all languages can be fetched."""
factory_language_model(
{'name': 'German', 'code': 'de', 'right_to_left': False}
)
factory_language_model(
{'name': 'Spanish', 'code': 'es', 'right_to_left': False}
)
session.commit()

languages = LanguageService.get_languages()
assert len(languages) >= 2


def test_create_language(session):
"""Assert that a language can be created."""
language_data = {'name': 'Italian', 'code': 'it', 'right_to_left': False}
created_language = LanguageService.create_language(language_data)

assert created_language.name == 'Italian'


def test_update_language(session):
"""Assert that a language can be updated."""
language = factory_language_model(
{'name': 'Japanese', 'code': 'jp', 'right_to_left': True}
)
session.add(language)
session.commit()

updated_data = {'name': 'Nihongo', 'right_to_left': True}
updated_language = LanguageService.update_language(
language.id, updated_data
)

assert updated_language.name == 'Nihongo'


def test_delete_language(session):
"""Assert that a language can be deleted."""
language = factory_language_model(
{'name': 'Russian', 'code': 'ru', 'right_to_left': False}
)
session.add(language)
session.commit()

LanguageService.delete_language(language.id)
deleted_language = Language.query.get(language.id)

assert deleted_language is None

# Testing for invalid id
is_deleted = LanguageService.delete_language(99999)
assert is_deleted is False
10 changes: 10 additions & 0 deletions met-api/tests/utilities/factory_scenarios.py
Original file line number Diff line number Diff line change
@@ -905,3 +905,13 @@ class TestEngagementContentInfo(dict, Enum):
'content_type': EngagementContentType.Custom.name,
'is_internal': False,
}


class TestLanguageInfo(dict, Enum):
"""Test scenarios of language polls."""

language1 = {
'name': 'Spanish',
'code': 'en',
'right_to_left': False,
}
19 changes: 16 additions & 3 deletions met-api/tests/utilities/factory_utils.py
Original file line number Diff line number Diff line change
@@ -16,11 +16,13 @@
Test Utility for creating model factory.
"""
from typing import Optional

from faker import Faker
from flask import current_app, g
from met_api.auth import Auth

from met_api.auth import Auth
from met_api.config import get_named_config
from met_api.constants.email_verification import EmailVerificationType
from met_api.constants.engagement_status import Status
from met_api.constants.widget import WidgetType
from met_api.models import Tenant
@@ -31,6 +33,7 @@
from met_api.models.engagement_settings import EngagementSettingsModel
from met_api.models.engagement_slug import EngagementSlug as EngagementSlugModel
from met_api.models.feedback import Feedback as FeedbackModel
from met_api.models.language import Language as LanguageModel
from met_api.models.membership import Membership as MembershipModel
from met_api.models.participant import Participant as ParticipantModel
from met_api.models.poll_answers import PollAnswer as PollAnswerModel
@@ -50,10 +53,9 @@
from met_api.models.widget_video import WidgetVideo as WidgetVideoModel
from met_api.utils.constants import TENANT_ID_HEADER
from met_api.utils.enums import MembershipStatus
from met_api.constants.email_verification import EmailVerificationType
from tests.utilities.factory_scenarios import (
TestCommentInfo, TestEngagementInfo, TestEngagementMetadataInfo, TestEngagementMetadataTaxonInfo,
TestEngagementSlugInfo, TestFeedbackInfo, TestJwtClaims, TestParticipantInfo, TestPollAnswerInfo,
TestEngagementSlugInfo, TestFeedbackInfo, TestJwtClaims, TestLanguageInfo, TestParticipantInfo, TestPollAnswerInfo,
TestPollResponseInfo, TestReportSettingInfo, TestSubmissionInfo, TestSurveyInfo, TestTenantInfo, TestTimelineInfo,
TestUserInfo, TestWidgetDocumentInfo, TestWidgetInfo, TestWidgetItemInfo, TestWidgetMap, TestWidgetPollInfo,
TestWidgetVideo)
@@ -502,3 +504,14 @@ def factory_widget_map_model(widget_map: dict = TestWidgetMap.map1):
)
widget_map.save()
return widget_map


def factory_language_model(lang_info: dict = TestLanguageInfo.language1):
"""Produce a Poll model."""
langauge = LanguageModel(
name=lang_info.get('name'),
code=lang_info.get('code'),
right_to_left=lang_info.get('right_to_left'),
)
langauge.save()
return langauge