-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtest_phone_image_output.py
More file actions
136 lines (105 loc) · 4.19 KB
/
test_phone_image_output.py
File metadata and controls
136 lines (105 loc) · 4.19 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
import unittest
from unittest.mock import Mock
from unittest.mock import patch
from unittest.mock import mock_open
from mirte_robot import phone
from sensor_msgs.msg import CompressedImage
import rospy
class MockPublisher:
def __init__(self, topicName, callback, queue_size):
self.publish = Mock()
class MockPhoneImageOutput:
def setImage(self, imageLocation):
self.imageLocation = imageLocation
class TestPhoneImageOutput(unittest.TestCase):
@patch('rospy.has_param')
def test_initialize_with_empty_config(self, hasParamMock):
# arange
def has_param_side_effect(value):
return False
hasParamMock.side_effect = has_param_side_effect
# act
phoneAPI = phone.createPhone()
# assert
self.assertFalse(hasattr(phoneAPI, "phone_image_outputs"))
@patch('rospy.get_param')
@patch('rospy.has_param')
def test_initialize_with_single_item_config(self, hasParamMock, getParamMock):
# arange
def has_param_side_effect(value):
return value == "/mirte/phone_image_output"
# dictionary containing single phone_image_ouput instance
def get_param_side_effect(value):
return {
"output_a": {
"name": "output_a",
}
}
hasParamMock.side_effect = has_param_side_effect
getParamMock.side_effect = get_param_side_effect
# act
phoneAPI = phone.createPhone()
# assert
self.assertTrue(hasattr(phoneAPI, "phone_image_outputs"))
self.assertNotEqual(phoneAPI.phone_image_outputs.get("output_a"), None)
@patch('rospy.get_param')
@patch('rospy.has_param')
def test_initialize_with_multi_item_config(self, hasParamMock, getParamMock):
# arange
def has_param_side_effect(value):
return value == "/mirte/phone_image_output"
# dictionary containing single phone_image_ouput instance
def get_param_side_effect(value):
return {
"output_a": {
"name": "output_a",
},
"output_b": {
"name": "output_b",
}
}
hasParamMock.side_effect = has_param_side_effect
getParamMock.side_effect = get_param_side_effect
# act
phoneAPI = phone.createPhone()
# assert
self.assertTrue(hasattr(phoneAPI, "phone_image_outputs"))
self.assertNotEqual(phoneAPI.phone_image_outputs.get("output_a"), None)
self.assertNotEqual(phoneAPI.phone_image_outputs.get("output_b"), None)
def test_correct_image_output_call(self):
# arange
phoneAPI = phone.createPhone()
phoneAPI.phone_image_outputs = {}
phoneAPI.phone_image_outputs['image_out'] = MockPhoneImageOutput()
# act
phoneAPI.setPhoneImage('image_out', 'zoef_logo')
# assert
expectedLocation = "/usr/local/src/mirte/mirte-oled-images/images/zoef_logo.png"
self.assertEqual(phoneAPI.phone_image_outputs['image_out'].imageLocation, expectedLocation)
@patch('builtins.open', mock_open(read_data='test_content'))
def test_open_correct_file_location(self):
# arange
phoneAPI = phone.createPhone()
imageOutput = phone.PhoneImageOutput("unit_tests/test_image")
fileName = "test"
# act
imageOutput.setImage(fileName)
# assert
open.assert_called_once_with(fileName, "rb")
# mock the publisher
@patch('builtins.open', mock_open(read_data='test_content'))
@patch('rospy.Publisher', MockPublisher)
def test_publish_correct_message(self):
# arange
phoneAPI = phone.createPhone()
topicName = "unit_tests/test_image"
imageOutput = phone.PhoneImageOutput(topicName)
# act
imageOutput.setImage("test")
# assert
mockPublish = imageOutput.publisher.publish
mockPublish.assert_called_once()
expectedMessage = CompressedImage()
expectedMessage.format = "png"
expectedMessage.data = 'test_content'
mockPublish.assert_called_once_with(expectedMessage)