Coverage for tests/endpoints/tests_releases.py: 100%

56 statements  

« prev     ^ index     » next       coverage.py v7.10.5, created at 2025-08-26 22:06 +0000

1from unittest.mock import patch 

2from tests.endpoints.endpoint_testing import TestEndpoints 

3 

4 

5class TestGetReleaseHistoryData(TestEndpoints): 

6 @patch("webapp.endpoints.releases.dashboard.snap_channel_map") 

7 @patch("webapp.endpoints.releases.dashboard.snap_release_history") 

8 def test_get_release_history_data_success( 

9 self, mock_snap_release_history, mock_snap_channel_map 

10 ): 

11 """Test successful retrieval of release history data""" 

12 snap_name = "test-snap" 

13 

14 # Mock release history response 

15 mock_release_history = [ 

16 { 

17 "revision": 1, 

18 "version": "1.0", 

19 "created_at": "2023-01-01T00:00:00Z", 

20 "architectures": ["amd64"], 

21 "channels": ["stable"], 

22 } 

23 ] 

24 mock_snap_release_history.return_value = mock_release_history 

25 

26 # Mock channel map response 

27 mock_channel_map_data = { 

28 "snap": { 

29 "title": "Test Snap", 

30 "private": False, 

31 "default-track": "latest", 

32 "tracks": [{"name": "latest"}], 

33 "publisher": {"display-name": "Test Publisher"}, 

34 }, 

35 "channel-map": [ 

36 {"channel": "stable", "revision": 1, "version": "1.0"} 

37 ], 

38 } 

39 mock_snap_channel_map.return_value = mock_channel_map_data 

40 

41 response = self.client.get(f"/api/{snap_name}/releases") 

42 data = response.get_json() 

43 

44 self.assertEqual(response.status_code, 200) 

45 self.assertTrue(data["success"]) 

46 self.assertIn("data", data) 

47 

48 context = data["data"] 

49 self.assertEqual(context["snap_name"], snap_name) 

50 self.assertEqual(context["snap_title"], "Test Snap") 

51 self.assertEqual(context["publisher_name"], "Test Publisher") 

52 self.assertEqual(context["release_history"], mock_release_history) 

53 self.assertFalse(context["private"]) 

54 self.assertEqual(context["default_track"], "latest") 

55 self.assertEqual( 

56 context["channel_map"], mock_channel_map_data["channel-map"] 

57 ) 

58 self.assertEqual( 

59 context["tracks"], mock_channel_map_data["snap"]["tracks"] 

60 ) 

61 

62 # Verify the dashboard methods were called with correct parameters 

63 mock_snap_release_history.assert_called_once() 

64 mock_snap_channel_map.assert_called_once() 

65 

66 @patch("webapp.endpoints.releases.dashboard.snap_channel_map") 

67 @patch("webapp.endpoints.releases.dashboard.snap_release_history") 

68 def test_get_release_history_data_default_track_none( 

69 self, mock_snap_release_history, mock_snap_channel_map 

70 ): 

71 """Test that default track defaults to 'latest' when None""" 

72 snap_name = "test-snap" 

73 

74 mock_snap_release_history.return_value = [] 

75 

76 # Mock channel map with default-track as None 

77 mock_channel_map_data = { 

78 "snap": { 

79 "title": "Test Snap", 

80 "private": False, 

81 "default-track": None, # This should default to "latest" 

82 "tracks": [], 

83 "publisher": {"display-name": "Test Publisher"}, 

84 }, 

85 "channel-map": [], 

86 } 

87 mock_snap_channel_map.return_value = mock_channel_map_data 

88 

89 response = self.client.get(f"/api/{snap_name}/releases") 

90 data = response.get_json() 

91 

92 self.assertEqual(response.status_code, 200) 

93 context = data["data"] 

94 self.assertEqual(context["default_track"], "latest") 

95 

96 @patch("webapp.endpoints.releases.dashboard.snap_channel_map") 

97 @patch("webapp.endpoints.releases.dashboard.snap_release_history") 

98 def test_get_release_history_data_empty_snap( 

99 self, mock_snap_release_history, mock_snap_channel_map 

100 ): 

101 """Test handling of empty snap data""" 

102 snap_name = "test-snap" 

103 

104 mock_snap_release_history.return_value = [] 

105 

106 # Mock channel map with empty snap data 

107 mock_channel_map_data = { 

108 "snap": {}, # Empty snap data 

109 "channel-map": [], 

110 } 

111 mock_snap_channel_map.return_value = mock_channel_map_data 

112 

113 response = self.client.get(f"/api/{snap_name}/releases") 

114 data = response.get_json() 

115 

116 self.assertEqual(response.status_code, 200) 

117 context = data["data"] 

118 self.assertEqual(context["snap_name"], snap_name) 

119 self.assertIsNone(context["snap_title"]) 

120 # Empty dict for missing publisher 

121 self.assertEqual(context["publisher_name"], {}) 

122 # Should default to latest 

123 self.assertEqual(context["default_track"], "latest") 

124 self.assertIsNone(context["private"]) 

125 self.assertIsNone(context["tracks"])