Coverage for cc_modules/tests/cc_sms_tests.py: 37%

46 statements  

« prev     ^ index     » next       coverage.py v6.5.0, created at 2022-11-08 23:14 +0000

1#!/usr/bin/env python 

2 

3""" 

4camcops_server/cc_modules/tests/cc_sms_tests.py 

5 

6=============================================================================== 

7 

8 Copyright (C) 2012, University of Cambridge, Department of Psychiatry. 

9 Created by Rudolf Cardinal (rnc1001@cam.ac.uk). 

10 

11 This file is part of CamCOPS. 

12 

13 CamCOPS is free software: you can redistribute it and/or modify 

14 it under the terms of the GNU General Public License as published by 

15 the Free Software Foundation, either version 3 of the License, or 

16 (at your option) any later version. 

17 

18 CamCOPS is distributed in the hope that it will be useful, 

19 but WITHOUT ANY WARRANTY; without even the implied warranty of 

20 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 

21 GNU General Public License for more details. 

22 

23 You should have received a copy of the GNU General Public License 

24 along with CamCOPS. If not, see <https://www.gnu.org/licenses/>. 

25 

26=============================================================================== 

27 

28""" 

29 

30import logging 

31from typing import cast 

32from unittest import mock, TestCase 

33 

34from camcops_server.cc_modules.cc_constants import SmsBackendNames 

35from camcops_server.cc_modules.cc_sms import ( 

36 get_sms_backend, 

37 ConsoleSmsBackend, 

38 KapowSmsBackend, 

39 TwilioSmsBackend, 

40) 

41 

42 

43TEST_MESSAGE = "Test Message" 

44# https://www.ofcom.org.uk/phones-telecoms-and-internet/information-for-industry/numbering/numbers-for-drama # noqa: E501 

45# 07700 900000 to 900999 reserved for TV and Radio drama purposes 

46TEST_RECIPIENT = "+447700900123" 

47TEST_SENDER = "+447700900456" 

48 

49 

50class KapowSmsBackendTests(TestCase): 

51 @mock.patch("camcops_server.cc_modules.cc_sms.requests.post") 

52 def test_sends_sms(self, mock_post: mock.Mock) -> None: 

53 

54 config = { 

55 KapowSmsBackend.PARAM_USERNAME: "testuser", 

56 KapowSmsBackend.PARAM_PASSWORD: "testpass", 

57 } 

58 

59 backend = get_sms_backend(SmsBackendNames.KAPOW, config) 

60 backend.send_sms(TEST_RECIPIENT, TEST_MESSAGE) 

61 

62 args, kwargs = mock_post.call_args 

63 

64 self.assertEqual( 

65 args[0], "https://www.kapow.co.uk/scripts/sendsms.php" 

66 ) 

67 

68 data = kwargs["data"] 

69 self.assertEqual(data["username"], "testuser") 

70 self.assertEqual(data["password"], "testpass") 

71 self.assertEqual(data["mobile"], TEST_RECIPIENT) 

72 self.assertEqual(data["sms"], TEST_MESSAGE) 

73 

74 

75class TwilioSmsBackendTests(TestCase): 

76 def test_backend_creates_client(self) -> None: 

77 config = { 

78 TwilioSmsBackend.PARAM_SID: "testsid", 

79 TwilioSmsBackend.PARAM_TOKEN: "testtoken", 

80 TwilioSmsBackend.PARAM_FROM_PHONE_NUMBER: TEST_SENDER, 

81 } 

82 

83 backend = cast( 

84 "TwilioSmsBackend", get_sms_backend(SmsBackendNames.TWILIO, config) 

85 ) 

86 

87 self.assertEqual(backend.client.username, "testsid") 

88 self.assertEqual(backend.client.password, "testtoken") 

89 

90 def test_sends_sms(self) -> None: 

91 config = { 

92 TwilioSmsBackend.PARAM_SID: "testsid", 

93 TwilioSmsBackend.PARAM_TOKEN: "testtoken", 

94 TwilioSmsBackend.PARAM_FROM_PHONE_NUMBER: TEST_SENDER, 

95 } 

96 

97 backend = cast( 

98 "TwilioSmsBackend", get_sms_backend(SmsBackendNames.TWILIO, config) 

99 ) 

100 

101 with mock.patch.object( 

102 backend.client.messages, "create" 

103 ) as mock_create: 

104 backend.send_sms(TEST_RECIPIENT, TEST_MESSAGE) 

105 

106 args, kwargs = mock_create.call_args 

107 

108 self.assertEqual(kwargs["to"], TEST_RECIPIENT) 

109 self.assertEqual(kwargs["from_"], TEST_SENDER) 

110 self.assertEqual(kwargs["body"], TEST_MESSAGE) 

111 

112 

113class ConsoleSmsBackendTests(TestCase): 

114 def test_sends_sms(self) -> None: 

115 

116 config = {} 

117 

118 backend = get_sms_backend(SmsBackendNames.CONSOLE, config) 

119 

120 with self.assertLogs(level=logging.INFO) as logging_cm: 

121 backend.send_sms(TEST_RECIPIENT, TEST_MESSAGE) 

122 

123 logger_name = "camcops_server.cc_modules.cc_sms" 

124 

125 self.assertIn(f"INFO:{logger_name}", logging_cm.output[0]) 

126 

127 self.assertIn( 

128 ConsoleSmsBackend.make_msg(TEST_RECIPIENT, TEST_MESSAGE), 

129 logging_cm.output[0], 

130 )