11import pytest
2+ from unittest import mock
23
34from public_api .version_02 .views .base import BaseNestedAPITimeSeriesViewV2
45
6+ class TestNestedTimeSeriesView (BaseNestedAPITimeSeriesViewV2 ):
7+ """
8+ Minimal concrete implementation so BaseNestedAPITimeSeriesView can be instantiated
9+ during unit tests.
10+ """
11+
12+ lookup_field = "mock"
13+
14+ serializer_class = mock .MagicMock
515
616class TestBaseNestedAPITimeSeriesViewV2 :
717 def test_raises_error_for_lookup_field_property (self ):
@@ -31,3 +41,95 @@ def test_raises_error_for_serializer_class_property(self):
3141 # When / Then
3242 with pytest .raises (NotImplementedError ):
3343 base_view .serializer_class
44+
45+ class TestGetAddsPrivateHeaderForNonPublicRequests :
46+ """
47+ Tests for the newly added private Cache-Control header behaviour in the `get()` method.
48+ """
49+
50+ @mock .patch ("public_api.version_02.views.base.backend.JSONWebTokenAuthentication.authenticate" )
51+ @mock .patch ("public_api.version_02.views.base.Response" )
52+ @mock .patch ("public_api.version_02.views.base.APITimeSeriesRequestSerializerv2" )
53+ def test_private_header_added_when_valid_jwt (
54+ self ,
55+ mock_request_serializer_class : mock .MagicMock ,
56+ mock_response_class : mock .MagicMock ,
57+ mock_backend_auth_authenticate : mock .MagicMock
58+ ):
59+ """
60+ Given `backend.JSONWebTokenAuthentication.authenticate()` returns True
61+ When `get()` is called
62+ Then the response contains Cache-Control: private, no-cache
63+ """
64+ # Given
65+ mock_backend_auth_authenticate .return_value = True
66+
67+ mocked_request = mock .MagicMock ()
68+
69+ mocked_slice = [mock .MagicMock ()]
70+ mock_request_serializer = mock .MagicMock ()
71+ mock_request_serializer .build_timeseries_dto_slice .return_value = mocked_slice
72+ mock_request_serializer_class .return_value = mock_request_serializer
73+
74+ mock_data_serializer = mock .MagicMock ()
75+ mock_data_serializer .data = {"foo" : "bar" }
76+
77+ base_view = TestNestedTimeSeriesView ()
78+ base_view .get_serializer = mock .MagicMock (return_value = mock_data_serializer )
79+
80+ mocked_response = mock .MagicMock ()
81+ mock_response_class .return_value = mocked_response
82+
83+ # When
84+ response = base_view .get (mocked_request )
85+
86+ # Then
87+ mock_backend_auth_authenticate .assert_called_once_with (mocked_request )
88+ mocked_response .__setitem__ .assert_called_once_with (
89+ "Cache-Control" , "private, no-cache"
90+ )
91+ assert response == mocked_response
92+
93+ @mock .patch ("public_api.version_02.views.base.backend.JSONWebTokenAuthentication.authenticate" )
94+ @mock .patch ("public_api.version_02.views.base.Response" )
95+ @mock .patch ("public_api.version_02.views.base.APITimeSeriesRequestSerializerv2" )
96+ def test_private_header_not_added_when_is_valid_non_public_request_is_false (
97+ self ,
98+ mock_request_serializer_class : mock .MagicMock ,
99+ mock_response_class : mock .MagicMock ,
100+ mock_backend_auth_authenticate : mock .MagicMock ,
101+ ):
102+ """
103+ Given `_is_valid_non_public_request()` returns False
104+ When `get()` is called
105+ Then the response does NOT contain a private Cache-Control header
106+ """
107+ # Given
108+ mock_backend_auth_authenticate .return_value = False
109+
110+ mocked_request = mock .MagicMock ()
111+
112+ # Mock DTO slice creation
113+ mocked_slice = [mock .MagicMock ()]
114+ mock_request_serializer = mock .MagicMock ()
115+ mock_request_serializer .build_timeseries_dto_slice .return_value = mocked_slice
116+ mock_request_serializer_class .return_value = mock_request_serializer
117+
118+ # Mock the final serializer
119+ mock_data_serializer = mock .MagicMock ()
120+ mock_data_serializer .data = {"foo" : "bar" }
121+
122+ base_view = TestNestedTimeSeriesView ()
123+ base_view .get_serializer = mock .MagicMock (return_value = mock_data_serializer )
124+
125+ # Mock Response
126+ mocked_response = mock .MagicMock ()
127+ mock_response_class .return_value = mocked_response
128+
129+ # When
130+ response = base_view .get (mocked_request )
131+
132+ # Then
133+ mock_backend_auth_authenticate .assert_called_once_with (mocked_request )
134+ mocked_response .__setitem__ .assert_not_called ()
135+ assert response == mocked_response
0 commit comments