@@ -110,3 +110,46 @@ def test_cameras_list_filtering(self, mock_requests_get):
110110 webcams_list = response .json ().get ('webcams' , [])
111111 webcams_list_length = len (webcams_list )
112112 assert webcams_list_length == 0
113+
114+ @patch ('apps.webcam.views.get_image_list' )
115+ def test_timelapse_filtering (self , mock_get_image_list ):
116+ pk = 67
117+ url = f"/api/webcams/{ pk } /timelapse/"
118+
119+ mock_timestamps = [
120+ "20260419140000" , # 07:00 Vancouver (UTC-7)
121+ "20260419150000" , # 08:00 Vancouver
122+ "20260419160000" , # 09:00 Vancouver
123+ "20260419170000" , # 10:00 Vancouver
124+ "20260419180000" , # 11:00 Vancouver
125+ "20260419230000" , # 16:00 Vancouver
126+ "20260420000000" , # 17:00 Vancouver
127+ "20260420010000" , # 18:00 Vancouver
128+ "20260420020000" , # 19:00 Vancouver (outside range)
129+ ]
130+
131+ # No filtering - returns all images
132+ mock_get_image_list .return_value = mock_timestamps
133+ response = self .client .get (url )
134+ assert response .status_code == 200
135+ result = response .json ()
136+ assert len (result ) == len (mock_timestamps )
137+
138+ # Filter by date and time in Vancouver timezone
139+ mock_get_image_list .return_value = mock_timestamps
140+ response = self .client .get (url , {
141+ 'from' : '2026-04-19' ,
142+ 'to' : '2026-04-19' ,
143+ 'time_from' : '08:00' ,
144+ 'time_to' : '18:00' ,
145+ 'timezone' : 'America/Vancouver' ,
146+ })
147+ assert response .status_code == 200
148+ result = response .json ()
149+ # 08:00-18:00 Vancouver = 15:00-01:00 UTC
150+ # Expected: 20260419150000 through 20260420010000 (inclusive)
151+ assert len (result ) == 7
152+ assert "20260419140000" not in result # 07:00 Vancouver - before range
153+ assert "20260419150000" in result # 08:00 Vancouver - start of range
154+ assert "20260420010000" in result # 18:00 Vancouver - end of range
155+ assert "20260420020000" not in result # 19:00 Vancouver - after
0 commit comments