Coverage for tests/interfaces/test_interface_routes.py: 100%

57 statements  

« prev     ^ index     » next       coverage.py v7.9.1, created at 2025-06-27 22:07 +0000

1from unittest import TestCase 

2from unittest.mock import patch, MagicMock 

3from webapp.app import app 

4from flask import url_for 

5 

6 

7class TestIntegrationRoutes(TestCase): 

8 def setUp(self): 

9 self.app = app 

10 self.app.config["TESTING"] = True 

11 self.app.config["SERVER_NAME"] = "localhost.localdomain" 

12 self.client = self.app.test_client() 

13 self.context = self.app.app_context() 

14 self.context.push() 

15 

16 def tearDown(self): 

17 self.context.pop() 

18 

19 @patch("webapp.integrations.logic.Interfaces.get_interfaces") 

20 @patch("webapp.integrations.logic.github_client.get_repo") 

21 def test_get_interfaces(self, mock_get_repo, mock_get_interfaces): 

22 mock_get_interfaces.return_value = [ 

23 { 

24 "name": "test_interface", 

25 "readme_path": "path/to/readme", 

26 "status": "live", 

27 } 

28 ] 

29 

30 mock_repo = MagicMock() 

31 mock_content = MagicMock() 

32 readme_content = "Mock README content" 

33 mock_content.decoded_content.decode.return_value = readme_content 

34 mock_repo.get_contents.return_value = mock_content 

35 mock_get_repo.return_value = mock_repo 

36 

37 response = self.client.get("/integrations.json") 

38 self.assertEqual(response.status_code, 200) 

39 json_data = response.json 

40 

41 self.assertIn("interfaces", json_data) 

42 self.assertIsInstance(json_data["interfaces"], list) 

43 

44 self.assertEqual( 

45 len(json_data["interfaces"]), 

46 1, 

47 "Expected 1 interface in the response", 

48 ) 

49 if json_data["interfaces"]: 

50 first_interface = json_data["interfaces"][0] 

51 self.assertEqual( 

52 first_interface["name"], 

53 "test_interface", 

54 "Interface name does not match expected value", 

55 ) 

56 self.assertEqual( 

57 first_interface["status"], 

58 "live", 

59 "Interface status does not match expected value", 

60 ) 

61 

62 @patch("webapp.integrations.views.get_single_interface") 

63 def test_single_interface_success(self, mock_get_single_interface): 

64 mock_response = MagicMock() 

65 mock_response.data.decode.return_value = ( 

66 '{"interface": {"name": "test_interface"}, "status": "live"}' 

67 ) 

68 mock_get_single_interface.return_value = mock_response 

69 

70 response = self.client.get( 

71 url_for("integrations.single_interface", path="test_interface") 

72 ) 

73 

74 self.assertEqual(response.status_code, 200) 

75 mock_get_single_interface.assert_called_with("test_interface", "") 

76 

77 @patch("webapp.integrations.views.get_single_interface") 

78 def test_single_interface_draft_redirect(self, mock_get_single_interface): 

79 mock_response = MagicMock() 

80 mock_response.data.decode.return_value = ( 

81 '{"name": "test_interface","status": "draft"}' 

82 ) 

83 mock_get_single_interface.return_value = mock_response 

84 

85 response = self.client.get( 

86 url_for("integrations.single_interface", path="test_interface") 

87 ) 

88 

89 self.assertEqual(response.status_code, 302) 

90 self.assertTrue(response.location.endswith("test_interface/draft")) 

91 

92 @patch("webapp.integrations.views.get_single_interface") 

93 def test_single_interface_not_found(self, mock_get_single_interface): 

94 mock_response = MagicMock() 

95 mock_response.data.decode.return_value = ( 

96 '{"other_charms": {"providers": [], "requirers": []}}' 

97 ) 

98 mock_get_single_interface.return_value = mock_response 

99 

100 response = self.client.get( 

101 url_for( 

102 "integrations.single_interface", path="nonexistent_interface" 

103 ) 

104 ) 

105 self.assertEqual(response.status_code, 404)