1+ import pytest
2+ from rest_framework .test import APIRequestFactory , force_authenticate
3+ from rest_framework import status
4+ from unittest .mock import AsyncMock
5+
6+ from goats_tom .tests .factories import UserFactory , GPPLoginFactory
7+ from goats_tom .api_views import GPPObservationViewSet
8+
9+
10+ @pytest .mark .django_db
11+ class TestGPPObservationViewSet :
12+ def setup_method (self ):
13+ self .factory = APIRequestFactory ()
14+ self .list_view = GPPObservationViewSet .as_view ({'get' : 'list' })
15+ self .retrieve_view = GPPObservationViewSet .as_view ({'get' : 'retrieve' })
16+
17+ self .observation_id = "o-23e1"
18+ self .observation_data = {"observation_id" : self .observation_id , "name" : "m27" }
19+ self .observations_url = "/api/gpp/observations/"
20+ self .observation_detail_url = f"/api/gpp/observations/{ self .observation_id } /"
21+
22+ # Setup users.
23+ self .user_with_login = UserFactory ()
24+ GPPLoginFactory (user = self .user_with_login )
25+ self .user_without_login = UserFactory ()
26+
27+ def test_list_observations_success (self , mocker ):
28+ mock_client = mocker .patch ("goats_tom.api_views.gpp.observations.GPPClient" )
29+ mock_client .return_value .observation .get_all = AsyncMock (return_value = [self .observation_data ])
30+
31+ request = self .factory .get (self .observations_url )
32+ force_authenticate (request , user = self .user_with_login )
33+
34+ response = self .list_view (request )
35+
36+ assert response .status_code == status .HTTP_200_OK
37+ assert response .data == [self .observation_data ]
38+ mock_client .return_value .observation .get_all .assert_called_once ()
39+
40+ def test_list_observations_missing_gpplogin (self ):
41+ request = self .factory .get (self .observations_url )
42+ force_authenticate (request , user = self .user_without_login )
43+
44+ response = self .list_view (request )
45+
46+ assert response .status_code == status .HTTP_403_FORBIDDEN
47+ assert response .data ["detail" ] == "GPP login credentials are not configured for this user."
48+
49+ def test_retrieve_observation_success (self , mocker ):
50+ mock_client = mocker .patch ("goats_tom.api_views.gpp.observations.GPPClient" )
51+ mock_client .return_value .observation .get_by_id = AsyncMock (return_value = self .observation_data )
52+
53+ request = self .factory .get (self .observation_detail_url )
54+ force_authenticate (request , user = self .user_with_login )
55+
56+ response = self .retrieve_view (request , pk = self .observation_id )
57+
58+ assert response .status_code == status .HTTP_200_OK
59+ assert response .data == self .observation_data
60+ mock_client .return_value .observation .get_by_id .assert_called_once_with (observation_id = self .observation_id )
61+
62+ def test_retrieve_observation_missing_gpplogin (self ):
63+ request = self .factory .get (self .observation_detail_url )
64+ force_authenticate (request , user = self .user_without_login )
65+
66+ response = self .retrieve_view (request , pk = self .observation_id )
67+
68+ assert response .status_code == status .HTTP_403_FORBIDDEN
69+ assert response .data ["detail" ] == "GPP login credentials are not configured for this user."
0 commit comments