@eohjsc/react-native-smart-city 0.2.97 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (197) hide show
  1. package/README.md +35 -14
  2. package/package.json +4 -2
  3. package/src/commons/Action/ItemQuickAction.js +5 -2
  4. package/src/commons/ActionGroup/ColorPickerTemplate.js +1 -1
  5. package/src/commons/ActionGroup/CurtainButtonTemplate.js +10 -5
  6. package/src/commons/ActionGroup/NumberUpDownActionTemplate.js +12 -4
  7. package/src/commons/ActionGroup/OnOffSmartLock/AutoLock/__test__/index.test.js +4 -0
  8. package/src/commons/ActionGroup/OnOffSmartLock/OnOffSmartLock.js +7 -4
  9. package/src/commons/ActionGroup/OnOffSmartLock/PasscodeList/ItemPasscode.js +1 -1
  10. package/src/commons/ActionGroup/OnOffSmartLock/PasscodeList/__test__/ItemPasscode.test.js +24 -0
  11. package/src/commons/ActionGroup/OnOffSmartLock/SetupGeneratePasscode/__test__/index.test.js +14 -0
  12. package/src/commons/ActionGroup/OnOffSmartLock/SetupGeneratePasscode/index.js +1 -0
  13. package/src/commons/ActionGroup/OnOffTemplate/OnOffSimpleTemplate.js +10 -10
  14. package/src/commons/ActionGroup/OnOffTemplate/index.js +18 -15
  15. package/src/commons/ActionGroup/OptionsDropdownActionTemplate.js +9 -3
  16. package/src/commons/ActionGroup/SliderRangeTemplate.js +1 -1
  17. package/src/commons/ActionGroup/SmartTiviActionTemplate/SmartTiviActionTemplate.js +4 -1
  18. package/src/commons/ActionGroup/StatesGridActionTemplate.js +22 -8
  19. package/src/commons/ActionGroup/TimerActionTemplate.js +11 -3
  20. package/src/commons/ActionGroup/TwoButtonTemplate/index.js +13 -9
  21. package/src/commons/ActionGroup/__test__/CurtainButtonTemplate.test.js +53 -4
  22. package/src/commons/ActionGroup/__test__/OnOffButtonTemplate.test.js +14 -14
  23. package/src/commons/ActionGroup/__test__/OnOffTemplate.test.js +53 -78
  24. package/src/commons/ActionGroup/__test__/OneBigButtonTemplate.test.js +36 -20
  25. package/src/commons/ActionGroup/__test__/StatesGridActionTemplate.test.js +77 -0
  26. package/src/commons/ActionGroup/__test__/TimerActionTemplate.test.js +58 -6
  27. package/src/commons/ActionGroup/__test__/TwoButtonTemplate.test.js +49 -1
  28. package/src/commons/ActionGroup/__test__/index.test.js +135 -0
  29. package/src/commons/Auth/AccountList.js +1 -1
  30. package/src/commons/Automate/ItemAutomate.js +1 -3
  31. package/src/commons/Calendar/__test__/Calendar.test.js +33 -0
  32. package/src/commons/Connecting/__test__/Connecting.test.js +19 -2
  33. package/src/commons/ConnectingProcess/__test__/Connecting.test.js +136 -3
  34. package/src/commons/ConnectingProcess/index.js +1 -1
  35. package/src/commons/Dashboard/MyPinnedSharedUnit/__test__/MyPinnedSharedUnit.test.js +16 -13
  36. package/src/commons/Dashboard/MyPinnedSharedUnit/index.js +1 -1
  37. package/src/commons/Dashboard/MyUnit/__test__/MyUnit.test.js +0 -5
  38. package/src/commons/Device/Hanet/ItemHanetDevice.test.js +58 -0
  39. package/src/commons/Device/HistoryChart.js +4 -0
  40. package/src/commons/Device/LinearChart.js +15 -0
  41. package/src/commons/Device/PMSensor/PMSensorIndicatior.js +16 -12
  42. package/src/commons/Device/PMSensor/PMSensorIndicatorStyles.js +3 -0
  43. package/src/commons/Device/WaterQualitySensor/ListQualityIndicator.js +1 -0
  44. package/src/commons/Explore/__test__/CityItem.test.js +33 -54
  45. package/src/commons/FieldTemplate/ChooseUserField/ChooseFieldStyles.js +25 -0
  46. package/src/commons/FieldTemplate/ChooseUserField/ChoosePopup.js +96 -0
  47. package/src/commons/FieldTemplate/ChooseUserField/ChoosePopupStyles.js +39 -0
  48. package/src/commons/FieldTemplate/ChooseUserField/__test__/index.test.js +118 -0
  49. package/src/commons/FieldTemplate/ChooseUserField/index.js +62 -0
  50. package/src/commons/FieldTemplate/PasscodeField/PasscodeFieldStyles.js +30 -0
  51. package/src/commons/FieldTemplate/PasscodeField/__test__/index.test.js +90 -0
  52. package/src/commons/FieldTemplate/PasscodeField/index.js +43 -0
  53. package/src/commons/FieldTemplate/ScheduleField/ScheduleFieldStyles.js +13 -0
  54. package/src/commons/FieldTemplate/ScheduleField/__test__/index.test.js +179 -0
  55. package/src/commons/FieldTemplate/ScheduleField/index.js +176 -0
  56. package/src/commons/FullLoading/index.js +2 -1
  57. package/src/commons/MenuActionAddnew/index.js +1 -0
  58. package/src/commons/MenuActionList/index.js +1 -0
  59. package/src/commons/MenuActionMore/index.js +1 -1
  60. package/src/commons/PreventAccess/__test__/PreventAccess.test.js +62 -0
  61. package/src/commons/PreventAccess/index.js +9 -1
  62. package/src/commons/Sharing/__test__/DevicePermissionsCheckbox.test.js +0 -1
  63. package/src/commons/SubUnit/OneTap/__test__/SubUnitAutomate.test.js +8 -35
  64. package/src/commons/SubUnit/OneTap/index.js +1 -2
  65. package/src/commons/Unit/SharedUnit.js +1 -0
  66. package/src/commons/Unit/__test__/SharedUnit.test.js +38 -183
  67. package/src/commons/WheelDateTimePicker/index.js +2 -1
  68. package/src/configs/API.js +87 -138
  69. package/src/configs/Constants.js +27 -1
  70. package/src/configs/SCConfig.js +2 -0
  71. package/src/iot/RemoteControl/__test__/GoogleHome.test.js +8 -30
  72. package/src/iot/RemoteControl/__test__/Internet.test.js +18 -7
  73. package/src/iot/RemoteControl/__test__/LgThinq.test.js +36 -177
  74. package/src/navigations/UnitStack.js +8 -0
  75. package/src/screens/AQIGuide/index.js +1 -1
  76. package/src/screens/ActivityLog/FilterPopup.js +2 -0
  77. package/src/screens/ActivityLog/__test__/index.test.js +38 -23
  78. package/src/screens/ActivityLog/hooks/__test__/index.test.js +51 -90
  79. package/src/screens/ActivityLog/index.js +2 -2
  80. package/src/screens/AddCommon/SelectSubUnit.js +1 -0
  81. package/src/screens/AddCommon/SelectUnit.js +1 -0
  82. package/src/screens/AddCommon/__test__/SelectSubUnit.test.js +13 -24
  83. package/src/screens/AddCommon/__test__/SelectUnit.test.js +9 -33
  84. package/src/screens/AddLocationMaps/index.js +4 -1
  85. package/src/screens/AddNewAction/SelectSensorDevices.js +8 -2
  86. package/src/screens/AddNewAction/__test__/SelectAction.test.js +10 -91
  87. package/src/screens/AddNewAction/__test__/SelectSensorDevices.test.js +40 -26
  88. package/src/screens/AddNewAutoSmart/__test__/AddNewAutoSmart.test.js +3 -1
  89. package/src/screens/AddNewAutoSmart/index.js +5 -2
  90. package/src/screens/AddNewDevice/ConnectingDevices.js +3 -3
  91. package/src/screens/AddNewDevice/__test__/AddNewDevice.test.js +34 -33
  92. package/src/screens/AddNewDevice/__test__/ConnectDevices.test.js +0 -4
  93. package/src/screens/AddNewDevice/__test__/ConnectingDevices.test.js +21 -21
  94. package/src/screens/AddNewDevice/index.js +1 -0
  95. package/src/screens/AddNewGateway/PlugAndPlay/GatewayWifiList.js +4 -1
  96. package/src/screens/AddNewGateway/SelectGateway.js +1 -0
  97. package/src/screens/AddNewGateway/SetupGatewayWifi.js +1 -0
  98. package/src/screens/AddNewGateway/__test__/AddNewGateway.test.js +4 -6
  99. package/src/screens/AddNewGateway/__test__/ConnectedGateway.test.js +0 -4
  100. package/src/screens/AddNewGateway/__test__/ConnectingGateway.test.js +5 -29
  101. package/src/screens/AddNewGateway/__test__/SelectGateway.test.js +0 -4
  102. package/src/screens/AddNewGateway/__test__/SetupGateway.test.js +0 -4
  103. package/src/screens/AddNewGateway/index.js +1 -0
  104. package/src/screens/AddNewOneTap/__test__/AddNewOneTap.test.js +10 -24
  105. package/src/screens/AddNewOneTap/index.js +3 -2
  106. package/src/screens/Automate/__test__/MultiUnits.test.js +6 -9
  107. package/src/screens/Automate/__test__/index.test.js +7 -12
  108. package/src/screens/Automate/index.js +2 -0
  109. package/src/screens/ConfirmUnitDeletion/__test__/ConfirmUnitDeletion.test.js +36 -8
  110. package/src/screens/ConfirmUnitDeletion/index.js +7 -1
  111. package/src/screens/Device/EditDevice/__test__/EditDevice.test.js +71 -22
  112. package/src/screens/Device/__test__/detail.test.js +23 -84
  113. package/src/screens/Device/detail.js +31 -8
  114. package/src/screens/Device/hooks/useFavoriteDevice.js +5 -9
  115. package/src/screens/DeviceInfo/__test__/index.test.js +0 -2
  116. package/src/screens/EmergencyContacts/EmergencyContactsSelectContacts.js +6 -3
  117. package/src/screens/EmergencyContacts/__test__/EmergencyContactAddNew.test.js +7 -19
  118. package/src/screens/EmergencyContacts/__test__/EmergencyContactList.test.js +20 -2
  119. package/src/screens/EmergencyContacts/__test__/EmergencyContactsSelectContacts.test.js +40 -23
  120. package/src/screens/EmergencySetting/index.js +4 -1
  121. package/src/screens/EnterPassword/__test__/EnterPassword.test.js +41 -25
  122. package/src/screens/Explore/index.js +2 -0
  123. package/src/screens/GuestInfo/__test__/index.test.js +14 -41
  124. package/src/screens/GuestInfo/components/RecurringDetail.js +1 -0
  125. package/src/screens/GuestInfo/components/TemporaryDetail.js +2 -2
  126. package/src/screens/HanetCamera/__test__/CaptureFaceID.test.js +8 -12
  127. package/src/screens/HanetCamera/__test__/Detail.test.js +27 -42
  128. package/src/screens/HanetCamera/__test__/ManageAccess.test.js +8 -5
  129. package/src/screens/HanetCamera/__test__/MemberInfo.test.js +10 -32
  130. package/src/screens/HanetCamera/hooks/__test__/useHanetCheckinData.test.js +43 -35
  131. package/src/screens/HanetCamera/hooks/__test__/useHanetPlaceMembers.test.js +10 -21
  132. package/src/screens/ManageAccess/__test__/ManageAccess.test.js +33 -22
  133. package/src/screens/ManageAccess/hooks/__test__/useManageAccess.test.js +44 -45
  134. package/src/screens/ManageAccess/index.js +2 -1
  135. package/src/screens/MoveToAnotherSubUnit/__test__/index.test.js +35 -12
  136. package/src/screens/MoveToAnotherSubUnit/index.js +5 -5
  137. package/src/screens/Notification/__test__/Notification.test.js +14 -25
  138. package/src/screens/Notification/__test__/NotificationItem.test.js +4 -3
  139. package/src/screens/PlayBackCamera/__test__/index.test.js +87 -2
  140. package/src/screens/PlayBackCamera/index.js +19 -3
  141. package/src/screens/ScanChipQR/__test__/ScanChipQR.test.js +7 -20
  142. package/src/screens/ScanChipQR/components/QRScan/index.js +1 -0
  143. package/src/screens/ScanSensorQR/__test__/ScanSensorQR.test.js +8 -24
  144. package/src/screens/ScriptDetail/__test__/index.test.js +17 -86
  145. package/src/screens/ScriptDetail/index.js +5 -4
  146. package/src/screens/SelectUnit/__test__/index.test.js +12 -55
  147. package/src/screens/SelectUnit/index.js +5 -2
  148. package/src/screens/SetSchedule/index.js +6 -2
  149. package/src/screens/SharedUnit/__test__/TabHeader.test.js +0 -2
  150. package/src/screens/SharedUnit/index.js +2 -0
  151. package/src/screens/Sharing/InfoMemberUnit.js +1 -1
  152. package/src/screens/Sharing/MemberList.js +12 -11
  153. package/src/screens/Sharing/SelectPermission.js +107 -70
  154. package/src/screens/Sharing/__test__/InfoMemberUnit.test.js +47 -29
  155. package/src/screens/Sharing/__test__/MemberList.test.js +13 -127
  156. package/src/screens/Sharing/__test__/MemberList2.test.js +80 -0
  157. package/src/screens/Sharing/__test__/SelectPermission.test.js +28 -38
  158. package/src/screens/Sharing/__test__/SelectUser.test.js +17 -38
  159. package/src/screens/Sharing/hooks/index.js +3 -0
  160. package/src/screens/SideMenuDetail/SideMenuDetailStyles.js +28 -0
  161. package/src/screens/SideMenuDetail/__test__/index.test.js +154 -0
  162. package/src/screens/SideMenuDetail/index.js +149 -0
  163. package/src/screens/SmartIr/components/SelectBrand.js +1 -1
  164. package/src/screens/SubUnit/ManageSubUnit.js +1 -0
  165. package/src/screens/SubUnit/__test__/AddSubUnit.test.js +21 -67
  166. package/src/screens/SubUnit/__test__/Detail.test.js +31 -8
  167. package/src/screens/SubUnit/__test__/EditSubUnit.test.js +21 -89
  168. package/src/screens/SubUnit/hooks/__test__/useManageSubUnit.test.js +47 -44
  169. package/src/screens/SyncLGDevice/AddLGDevice.js +1 -0
  170. package/src/screens/SyncLGDevice/__test__/AddLGDevice.test.js +14 -90
  171. package/src/screens/TDSGuide/index.js +4 -1
  172. package/src/screens/UVIndexGuide/index.js +1 -1
  173. package/src/screens/Unit/ChooseLocation.js +1 -1
  174. package/src/screens/Unit/ManageUnit.js +1 -0
  175. package/src/screens/Unit/SelectAddress.js +4 -1
  176. package/src/screens/Unit/Station/index.js +1 -0
  177. package/src/screens/Unit/Summaries.js +1 -1
  178. package/src/screens/Unit/__test__/CheckSendEmail.test.js +15 -28
  179. package/src/screens/Unit/__test__/ChooseLocation.test.js +27 -14
  180. package/src/screens/Unit/__test__/Detail.test.js +83 -185
  181. package/src/screens/Unit/__test__/ManageUnit.test.js +18 -42
  182. package/src/screens/Unit/__test__/SelectAddress.test.js +13 -39
  183. package/src/screens/Unit/__test__/SmartAccount.test.js +17 -9
  184. package/src/screens/Unit/__test__/SmartAccountItem.test.js +0 -1
  185. package/src/screens/Unit/components/MyAllUnit/__test__/MyAllUnit.test.js +36 -0
  186. package/src/screens/Unit/components/MyAllUnit/__test__/index.test.js +54 -0
  187. package/src/screens/Unit/components/SharedUnit/index.js +1 -0
  188. package/src/screens/Unit/components/__test__/SharedUnit.test.js +31 -34
  189. package/src/screens/UnitSummary/__test__/index.test.js +38 -31
  190. package/src/screens/UnitSummary/components/PowerConsumeHistoryChart/__test__/index.test.js +7 -4
  191. package/src/screens/UnitSummary/components/PowerConsumption/__test__/PowerConsumption.test.js +14 -16
  192. package/src/screens/WaterQualityGuide/index.js +1 -1
  193. package/src/utils/Apis/axios.js +37 -13
  194. package/src/utils/I18n/translations/en.json +1 -0
  195. package/src/utils/I18n/translations/vi.json +1 -0
  196. package/src/utils/Route/index.js +1 -0
  197. package/src/utils/Utils.js +6 -6
@@ -14,9 +14,9 @@ import { Colors } from '../../configs';
14
14
  import { useConfigGlobalState } from '../../iot/states';
15
15
  import BottomScrollPicker from '../BottomScrollPicker';
16
16
 
17
- const TimerActionTemplate = ({ actionGroup, doAction, sensor }) => {
17
+ const TimerActionTemplate = ({ actionGroup = {}, doAction, sensor = {} }) => {
18
18
  const t = useTranslations();
19
- const { configuration, title } = actionGroup;
19
+ const { configuration = {}, title } = actionGroup;
20
20
  const [showTime, setShowTime] = useState(false);
21
21
  const [showHour, setShowHour] = useState(false);
22
22
 
@@ -94,6 +94,7 @@ const TimerActionTemplate = ({ actionGroup, doAction, sensor }) => {
94
94
  if (sensor.is_managed_by_backend) {
95
95
  hour !== undefined &&
96
96
  minute !== undefined &&
97
+ sensor.device_type !== 'GOOGLE_HOME' &&
97
98
  watchMultiConfigs([
98
99
  configuration.config_hour,
99
100
  configuration.config_minute,
@@ -106,13 +107,17 @@ const TimerActionTemplate = ({ actionGroup, doAction, sensor }) => {
106
107
  configuration.config_minute,
107
108
  doAction,
108
109
  sensor.is_managed_by_backend,
110
+ sensor.device_type,
109
111
  ]
110
112
  );
111
113
 
112
114
  const doActionHour = useCallback(
113
115
  (hour) => {
114
116
  doAction(configuration.action_data, hour);
115
- if (sensor.is_managed_by_backend) {
117
+ if (
118
+ sensor.is_managed_by_backend &&
119
+ sensor.device_type !== 'GOOGLE_HOME'
120
+ ) {
116
121
  hour && watchMultiConfigs([configuration.config_hour]);
117
122
  }
118
123
  },
@@ -121,6 +126,7 @@ const TimerActionTemplate = ({ actionGroup, doAction, sensor }) => {
121
126
  configuration.config_hour,
122
127
  doAction,
123
128
  sensor.is_managed_by_backend,
129
+ sensor.device_type,
124
130
  ]
125
131
  );
126
132
 
@@ -201,6 +207,8 @@ const TimerActionTemplate = ({ actionGroup, doAction, sensor }) => {
201
207
  onConfirm={onConfirmTime}
202
208
  onCancel={onHideTime}
203
209
  display="spinner"
210
+ cancelTextIOS={t('cancel')}
211
+ confirmTextIOS={t('confirm')}
204
212
  />
205
213
  <BottomScrollPicker
206
214
  min={configuration.min}
@@ -28,16 +28,18 @@ const TwoButtonTemplate = memo(({ actionGroup, doAction, sensor }) => {
28
28
  [actionGroup?.title, sensor?.name]
29
29
  );
30
30
 
31
- const triggerAction1 = useCallback(() => {
31
+ const triggerAction1 = useCallback(async () => {
32
32
  if (button1?.action_on_data && button1?.action_off_data) {
33
33
  if (isOn) {
34
- doAction(button1?.action_off_data, null, actionName('off'));
34
+ await doAction(button1?.action_off_data, null, actionName('off'));
35
35
  } else {
36
- doAction(button1?.action_on_data, null, actionName('on'));
36
+ await doAction(button1?.action_on_data, null, actionName('on'));
37
37
  }
38
38
  }
39
39
  if (sensor?.is_managed_by_backend) {
40
- configuration.config && watchMultiConfigs([configuration.config]);
40
+ configuration.config &&
41
+ sensor.device_type !== 'GOOGLE_HOME' &&
42
+ watchMultiConfigs([configuration.config]);
41
43
  }
42
44
  }, [
43
45
  actionName,
@@ -46,17 +48,18 @@ const TwoButtonTemplate = memo(({ actionGroup, doAction, sensor }) => {
46
48
  doAction,
47
49
  isOn,
48
50
  sensor?.is_managed_by_backend,
51
+ sensor?.device_type,
49
52
  ]);
50
53
 
51
- const triggerAction2 = useCallback(() => {
54
+ const triggerAction2 = useCallback(async () => {
52
55
  if (button2?.action_on_data && button2?.action_off_data) {
53
56
  if (isStart) {
54
- doAction(button2?.action_off_data, null, actionName('stop'));
57
+ await doAction(button2?.action_off_data, null, actionName('stop'));
55
58
  } else {
56
- doAction(button2?.action_on_data, null, actionName('start'));
59
+ await doAction(button2?.action_on_data, null, actionName('start'));
57
60
  }
58
61
  }
59
- if (sensor?.is_managed_by_backend) {
62
+ if (sensor?.is_managed_by_backend && sensor.device_type !== 'GOOGLE_HOME') {
60
63
  configuration.config && watchMultiConfigs([configuration.config]);
61
64
  }
62
65
  }, [
@@ -67,6 +70,7 @@ const TwoButtonTemplate = memo(({ actionGroup, doAction, sensor }) => {
67
70
  doAction,
68
71
  isStart,
69
72
  sensor?.is_managed_by_backend,
73
+ sensor?.device_type,
70
74
  ]);
71
75
 
72
76
  useEffect(() => {
@@ -98,7 +102,7 @@ const TwoButtonTemplate = memo(({ actionGroup, doAction, sensor }) => {
98
102
  if (sensor?.device_type === DEVICE_TYPE.LG_THINQ) {
99
103
  return;
100
104
  }
101
- if (sensor?.is_managed_by_backend) {
105
+ if (sensor?.is_managed_by_backend && sensor.device_type !== 'GOOGLE_HOME') {
102
106
  watchMultiConfigs([configuration.config]);
103
107
  }
104
108
  }, [sensor, configuration.config]);
@@ -1,20 +1,37 @@
1
1
  import React from 'react';
2
2
  import renderer, { act } from 'react-test-renderer';
3
- import { TouchableOpacity } from 'react-native';
3
+ import { TouchableOpacity, Switch } from 'react-native';
4
4
 
5
5
  import CurtainButtonTemplate from '../CurtainButtonTemplate';
6
6
  import { SCProvider } from '../../../context';
7
7
  import { mockSCStore } from '../../../context/mockStore';
8
8
 
9
- const wrapComponent = (actionGroup) => (
9
+ const mockDoAction = jest.fn();
10
+ const mockActionOffData = jest.fn();
11
+ const mockActionOnData = jest.fn();
12
+ const mockCloseActionData = jest.fn();
13
+
14
+ const wrapComponent = (actionGroup = {}, sensor = {}) => (
10
15
  <SCProvider initState={mockSCStore({})}>
11
- <CurtainButtonTemplate actionGroup={actionGroup} doAction={jest.fn()} />
16
+ <CurtainButtonTemplate
17
+ actionGroup={actionGroup}
18
+ doAction={mockDoAction}
19
+ sensor={sensor}
20
+ />
12
21
  </SCProvider>
13
22
  );
14
23
 
15
24
  describe('Test CurtainButtonTemplate', () => {
25
+ const sensor = {
26
+ name: 'test',
27
+ };
16
28
  const actionGroup = {
17
29
  configuration: {
30
+ text_open: 'open',
31
+ is_display_lock: true,
32
+ action_off_data: mockActionOffData,
33
+ action_on_data: mockActionOnData,
34
+ close_action_data: mockCloseActionData,
18
35
  action1: '2b949045-8e03-4c07-a855-7794ade2e69c',
19
36
  action1_data: {
20
37
  color: '#00979D',
@@ -61,12 +78,44 @@ describe('Test CurtainButtonTemplate', () => {
61
78
 
62
79
  let wrapper;
63
80
 
81
+ test('render without params', async () => {
82
+ await act(() => {
83
+ wrapper = renderer.create(wrapComponent());
84
+ });
85
+ const instance = wrapper.root;
86
+ const touchableOpacities = instance.findAllByType(TouchableOpacity);
87
+ expect(touchableOpacities.length).toEqual(3);
88
+ });
89
+
64
90
  test('render CurtainButtonTemplate', async () => {
65
91
  await act(() => {
66
- wrapper = renderer.create(wrapComponent(actionGroup));
92
+ wrapper = renderer.create(wrapComponent(actionGroup, sensor));
67
93
  });
68
94
  const instance = wrapper.root;
69
95
  const touchableOpacities = instance.findAllByType(TouchableOpacity);
70
96
  expect(touchableOpacities.length).toEqual(3);
97
+ await touchableOpacities[0].props.onPress();
98
+ await touchableOpacities[1].props.onPress();
99
+ await touchableOpacities[2].props.onPress();
100
+ expect(mockDoAction).toBeCalledWith(
101
+ mockCloseActionData,
102
+ null,
103
+ sensor?.name + ' undefined'
104
+ );
105
+
106
+ const Switchs = instance.findAllByType(Switch);
107
+ expect(Switchs).toHaveLength(1);
108
+ await Switchs[0].props.onValueChange();
109
+ expect(mockDoAction).toBeCalledWith(
110
+ mockActionOnData,
111
+ null,
112
+ `${sensor.name} lock`
113
+ );
114
+ await Switchs[0].props.onValueChange();
115
+ expect(mockDoAction).toBeCalledWith(
116
+ mockActionOffData,
117
+ null,
118
+ `${sensor.name} unlock`
119
+ );
71
120
  });
72
121
  });
@@ -1,6 +1,14 @@
1
1
  import React, { useState } from 'react';
2
2
  import { act, create } from 'react-test-renderer';
3
- import Index from '../OnOffTemplate';
3
+ import OnOffTemplate from '../OnOffTemplate';
4
+ import { mockSCStore } from '../../../context/mockStore';
5
+ import { SCProvider } from '../../../context';
6
+
7
+ const wrapComponent = (actionGroup, mockDoAction) => (
8
+ <SCProvider initState={mockSCStore({})}>
9
+ <OnOffTemplate actionGroup={actionGroup} doAction={mockDoAction} />
10
+ </SCProvider>
11
+ );
4
12
 
5
13
  jest.mock('react', () => ({
6
14
  ...jest.requireActual('react'),
@@ -49,21 +57,15 @@ describe('Test OneBigButtonTemplate', () => {
49
57
  const assertRender = (state, text) => {
50
58
  useState.mockImplementationOnce((init) => [state, setState]);
51
59
  const mockDoAction = jest.fn();
60
+
52
61
  act(() => {
53
- wrapper = create(
54
- <Index actionGroup={actionGroup} doAction={mockDoAction} />
55
- );
62
+ wrapper = create(wrapComponent(actionGroup, mockDoAction));
56
63
  });
57
64
 
58
65
  const renderJson = wrapper.toJSON();
59
66
 
60
- expect(renderJson?.children[0].children[0].children[1].children).toEqual(
61
- undefined
62
- );
63
-
64
- expect(
65
- renderJson?.children[0].children[0].children[1].children
66
- ).not.toEqual([text]);
67
+ expect(renderJson?.props?.visible).toEqual(false);
68
+ expect(renderJson?.type).toEqual('Modal');
67
69
  };
68
70
 
69
71
  test('render state on', () => {
@@ -78,9 +80,7 @@ describe('Test OneBigButtonTemplate', () => {
78
80
  useState.mockImplementationOnce((init) => [state, setState]);
79
81
  const mockDoAction = jest.fn();
80
82
  act(() => {
81
- wrapper = create(
82
- <Index actionGroup={actionGroup} doAction={mockDoAction} />
83
- );
83
+ wrapper = create(wrapComponent(actionGroup, mockDoAction));
84
84
  });
85
85
 
86
86
  expect(mockDoAction).not.toHaveBeenCalled();
@@ -1,11 +1,25 @@
1
+ /* eslint-disable promise/prefer-await-to-callbacks */
1
2
  import { TESTID } from '../../../configs/Constants';
2
3
  import { watchMultiConfigs } from '../../../iot/Monitor';
3
4
  import React from 'react';
4
5
  import { View } from 'react-native';
6
+ import { useSelector } from 'react-redux';
5
7
  import { act, create } from 'react-test-renderer';
6
8
  import OnOffTemplate from '../OnOffTemplate';
7
9
  import OnOffButtonTemplate from '../OnOffTemplate/OnOffButtonTemplate';
8
10
  import OnOffSimpleTemplate from '../OnOffTemplate/OnOffSimpleTemplate';
11
+ import { mockSCStore } from '../../../context/mockStore';
12
+ import { SCProvider } from '../../../context';
13
+
14
+ const wrapComponent = (actionGroup, mockDoAction, sensor) => (
15
+ <SCProvider initState={mockSCStore({})}>
16
+ <OnOffTemplate
17
+ actionGroup={actionGroup}
18
+ doAction={mockDoAction}
19
+ sensor={sensor}
20
+ />
21
+ </SCProvider>
22
+ );
9
23
 
10
24
  jest.mock('../../../iot/Monitor');
11
25
 
@@ -13,9 +27,15 @@ jest.mock('../../../iot/states', () => ({
13
27
  useConfigGlobalState: () => [{ 5: 2 }, null],
14
28
  }));
15
29
 
30
+ jest.mock('react-redux', () => ({
31
+ ...jest.requireActual('react-redux'),
32
+ useSelector: jest.fn(),
33
+ }));
34
+
16
35
  describe('Test OnOffTemplate', () => {
17
- let wrapper;
18
36
  let actionGroup;
37
+ let tree;
38
+ let sensor;
19
39
 
20
40
  const action_data = {
21
41
  color: '#00979D',
@@ -62,20 +82,23 @@ describe('Test OnOffTemplate', () => {
62
82
  },
63
83
  title: 'Turn on / off',
64
84
  };
85
+
86
+ sensor = { name: 'Sensor' };
87
+
88
+ const localState = {
89
+ isOnSwich: false,
90
+ };
91
+ useSelector.mockImplementation((cb) => {
92
+ return cb(localState);
93
+ });
65
94
  });
66
95
 
67
96
  test('render with template OnOffSimpleActionTemplate', async () => {
68
97
  const mockDoAction = jest.fn();
69
98
  await act(async () => {
70
- wrapper = await create(
71
- <OnOffTemplate
72
- actionGroup={actionGroup}
73
- doAction={mockDoAction}
74
- sensor={{}}
75
- />
76
- );
99
+ tree = await create(wrapComponent(actionGroup, mockDoAction, {}));
77
100
  });
78
- const instance = wrapper.root;
101
+ const instance = tree.root;
79
102
  const template = instance.findAllByType(OnOffSimpleTemplate);
80
103
  expect(template).toHaveLength(1);
81
104
  });
@@ -84,15 +107,9 @@ describe('Test OnOffTemplate', () => {
84
107
  actionGroup.template = 'on_off_button_action_template';
85
108
  const mockDoAction = jest.fn();
86
109
  await act(async () => {
87
- wrapper = await create(
88
- <OnOffTemplate
89
- actionGroup={actionGroup}
90
- doAction={mockDoAction}
91
- sensor={{}}
92
- />
93
- );
110
+ tree = await create(wrapComponent(actionGroup, mockDoAction, {}));
94
111
  });
95
- const instance = wrapper.root;
112
+ const instance = tree.root;
96
113
  const template = instance.findAllByType(OnOffButtonTemplate);
97
114
  expect(template).toHaveLength(0);
98
115
  });
@@ -101,15 +118,9 @@ describe('Test OnOffTemplate', () => {
101
118
  actionGroup.template = 'wrong_template';
102
119
  const mockDoAction = jest.fn();
103
120
  await act(async () => {
104
- wrapper = await create(
105
- <OnOffTemplate
106
- actionGroup={actionGroup}
107
- doAction={mockDoAction}
108
- sensor={{}}
109
- />
110
- );
121
+ tree = await create(wrapComponent(actionGroup, mockDoAction, {}));
111
122
  });
112
- const instance = wrapper.root;
123
+ const instance = tree.root;
113
124
 
114
125
  const templateOnOffButton = instance.findAll(
115
126
  (el) =>
@@ -125,32 +136,20 @@ describe('Test OnOffTemplate', () => {
125
136
  test('render with template OnOffSimpleActionTemplate with is_managed_by_backend', async () => {
126
137
  const mockDoAction = jest.fn();
127
138
  await act(async () => {
128
- wrapper = await create(
129
- <OnOffTemplate
130
- actionGroup={actionGroup}
131
- doAction={mockDoAction}
132
- sensor={{ is_managed_by_backend: true }}
133
- />
134
- );
139
+ tree = await create(wrapComponent(actionGroup, mockDoAction, {}));
135
140
  });
136
- const instance = wrapper.root;
141
+ const instance = tree.root;
137
142
  const template = instance.findAllByType(OnOffSimpleTemplate);
138
143
  expect(template).toHaveLength(1);
139
- expect(watchMultiConfigs).toBeCalledTimes(1);
144
+ expect(watchMultiConfigs).toBeCalledTimes(0);
140
145
  });
141
146
 
142
147
  test('template OnOffSimpleActionTemplate doAction with is_on_value, match configValue', async () => {
143
148
  const mockDoAction = jest.fn();
144
149
  await act(async () => {
145
- wrapper = await create(
146
- <OnOffTemplate
147
- actionGroup={actionGroup}
148
- doAction={mockDoAction}
149
- sensor={{ name: 'Sensor name' }}
150
- />
151
- );
150
+ tree = await create(wrapComponent(actionGroup, mockDoAction, sensor));
152
151
  });
153
- const instance = wrapper.root;
152
+ const instance = tree.root;
154
153
  const template = instance.findByType(OnOffSimpleTemplate);
155
154
  expect(template.props.isOn).toEqual(true);
156
155
 
@@ -160,7 +159,7 @@ describe('Test OnOffTemplate', () => {
160
159
  expect(mockDoAction).toHaveBeenCalledWith(
161
160
  action_off_data,
162
161
  null,
163
- 'Sensor name turn on / off off'
162
+ 'Sensor turn on / off off'
164
163
  );
165
164
  expect(watchMultiConfigs).toBeCalledTimes(0);
166
165
  });
@@ -169,15 +168,9 @@ describe('Test OnOffTemplate', () => {
169
168
  actionGroup.configuration.is_on_value = [1];
170
169
  const mockDoAction = jest.fn();
171
170
  await act(async () => {
172
- wrapper = await create(
173
- <OnOffTemplate
174
- actionGroup={actionGroup}
175
- doAction={mockDoAction}
176
- sensor={{ name: 'Sensor name' }}
177
- />
178
- );
171
+ tree = await create(wrapComponent(actionGroup, mockDoAction, sensor));
179
172
  });
180
- const instance = wrapper.root;
173
+ const instance = tree.root;
181
174
  const template = instance.findByType(OnOffSimpleTemplate);
182
175
  expect(template.props.isOn).toEqual(false);
183
176
 
@@ -187,22 +180,16 @@ describe('Test OnOffTemplate', () => {
187
180
  expect(mockDoAction).toHaveBeenCalledWith(
188
181
  action_on_data,
189
182
  null,
190
- 'Sensor name turn on / off on'
183
+ 'Sensor turn on / off on'
191
184
  );
192
185
  });
193
186
 
194
187
  test('template OnOffSimpleActionTemplate doAction with is_on_value and is_managed_by_backend', async () => {
195
188
  const mockDoAction = jest.fn();
196
189
  await act(async () => {
197
- wrapper = await create(
198
- <OnOffTemplate
199
- actionGroup={actionGroup}
200
- doAction={mockDoAction}
201
- sensor={{ name: 'Sensor name', is_managed_by_backend: true }}
202
- />
203
- );
190
+ tree = await create(wrapComponent(actionGroup, mockDoAction, sensor));
204
191
  });
205
- const instance = wrapper.root;
192
+ const instance = tree.root;
206
193
  const template = instance.findByType(OnOffSimpleTemplate);
207
194
  expect(template.props.isOn).toEqual(true);
208
195
 
@@ -212,9 +199,9 @@ describe('Test OnOffTemplate', () => {
212
199
  expect(mockDoAction).toHaveBeenCalledWith(
213
200
  action_off_data,
214
201
  null,
215
- 'Sensor name turn on / off off'
202
+ 'Sensor turn on / off off'
216
203
  );
217
- expect(watchMultiConfigs).toBeCalledTimes(2);
204
+ expect(watchMultiConfigs).toBeCalledTimes(0);
218
205
  });
219
206
 
220
207
  test('render with template OnOffSimpleActionTemplate with just action_data', async () => {
@@ -230,15 +217,9 @@ describe('Test OnOffTemplate', () => {
230
217
  };
231
218
  const mockDoAction = jest.fn();
232
219
  await act(async () => {
233
- wrapper = await create(
234
- <OnOffTemplate
235
- actionGroup={actionGroup}
236
- doAction={mockDoAction}
237
- sensor={{ is_managed_by_backend: true }}
238
- />
239
- );
220
+ tree = await create(wrapComponent(actionGroup, mockDoAction, {}));
240
221
  });
241
- const instance = wrapper.root;
222
+ const instance = tree.root;
242
223
  const template = instance.findAllByType(OnOffSimpleTemplate);
243
224
  expect(template).toHaveLength(1);
244
225
  expect(template[0].props.disabled).toBeFalsy();
@@ -261,15 +242,9 @@ describe('Test OnOffTemplate', () => {
261
242
  };
262
243
  const mockDoAction = jest.fn();
263
244
  await act(async () => {
264
- wrapper = await create(
265
- <OnOffTemplate
266
- actionGroup={actionGroup}
267
- doAction={mockDoAction}
268
- sensor={{ is_managed_by_backend: true }}
269
- />
270
- );
245
+ tree = await create(wrapComponent(actionGroup, mockDoAction, {}));
271
246
  });
272
- const instance = wrapper.root;
247
+ const instance = tree.root;
273
248
  const template = instance.findAllByType(OnOffSimpleTemplate);
274
249
  expect(template).toHaveLength(1);
275
250
  expect(template[0].props.disabled).toBeTruthy();
@@ -1,8 +1,27 @@
1
+ /* eslint-disable promise/prefer-await-to-callbacks */
1
2
  import React from 'react';
2
3
  import { create, act } from 'react-test-renderer';
3
4
  import { TouchableOpacity } from 'react-native';
5
+ import { useSelector } from 'react-redux';
4
6
 
5
7
  import OneBigButtonTemplate from '../OneBigButtonTemplate';
8
+ import { mockSCStore } from '../../../context/mockStore';
9
+ import { SCProvider } from '../../../context';
10
+
11
+ const wrapComponent = (actionGroup, mockDoAction, sensor) => (
12
+ <SCProvider initState={mockSCStore({})}>
13
+ <OneBigButtonTemplate
14
+ actionGroup={actionGroup}
15
+ doAction={mockDoAction}
16
+ sensor={sensor}
17
+ />
18
+ </SCProvider>
19
+ );
20
+
21
+ jest.mock('react-redux', () => ({
22
+ ...jest.requireActual('react-redux'),
23
+ useSelector: jest.fn(),
24
+ }));
6
25
 
7
26
  describe('Test OneBigButtonTemplate', () => {
8
27
  const action_data = {
@@ -23,24 +42,25 @@ describe('Test OneBigButtonTemplate', () => {
23
42
  text: 'UP',
24
43
  },
25
44
  };
26
- const sensor = {
27
- name: 'Sensor name',
28
- };
29
- let wrapper;
45
+ let tree;
46
+ let sensor;
30
47
 
31
- test('render OneBigButtonTemplate', () => {
32
- const mockDoAction = jest.fn();
33
- act(() => {
34
- wrapper = create(
35
- <OneBigButtonTemplate
36
- actionGroup={actionGroup}
37
- doAction={mockDoAction}
38
- sensor={sensor}
39
- />
40
- );
48
+ beforeEach(() => {
49
+ const localState = {
50
+ isOnSwich: false,
51
+ };
52
+ useSelector.mockImplementation((cb) => {
53
+ return cb(localState);
41
54
  });
55
+ sensor = { name: 'Sensor' };
56
+ });
42
57
 
43
- const instance = wrapper.root;
58
+ test('render OneBigButtonTemplate', async () => {
59
+ const mockDoAction = jest.fn();
60
+ await act(async () => {
61
+ tree = await create(wrapComponent(actionGroup, mockDoAction, sensor));
62
+ });
63
+ const instance = tree.root;
44
64
  const buttons = instance.findAllByType(TouchableOpacity);
45
65
  expect(buttons.length).toEqual(1);
46
66
 
@@ -49,10 +69,6 @@ describe('Test OneBigButtonTemplate', () => {
49
69
  });
50
70
 
51
71
  expect(mockDoAction).toHaveBeenCalledTimes(1);
52
- expect(mockDoAction).toHaveBeenCalledWith(
53
- action_data,
54
- null,
55
- 'Sensor name up'
56
- );
72
+ expect(mockDoAction).toHaveBeenCalledWith(action_data, null, 'Sensor up');
57
73
  });
58
74
  });
@@ -0,0 +1,77 @@
1
+ import React from 'react';
2
+ import { TouchableOpacity } from 'react-native';
3
+ import { act, create } from 'react-test-renderer';
4
+ import Text from '../../Text';
5
+ import StatesGridActionTemplate from '../StatesGridActionTemplate';
6
+
7
+ const mockDoAction = jest.fn();
8
+ const mockActionData = jest.fn();
9
+
10
+ describe('Test StatesGridActionTemplate', () => {
11
+ let tree;
12
+ const actionGroup = {
13
+ configuration: {
14
+ options: [
15
+ {
16
+ config: true,
17
+ active: false,
18
+ text: 'item 1',
19
+ icon_kit_data: 'icon_kit_data',
20
+ icon: '123',
21
+ icon_outlined: 'icon_outlined',
22
+ action_data: mockActionData,
23
+ },
24
+ {
25
+ config: false,
26
+ active: true,
27
+ text: 'item 2',
28
+ icon_kit_data: 'icon_kit_data',
29
+ icon: 'icon',
30
+ icon_outlined: 'icon_outlined',
31
+ action_data: mockActionData,
32
+ },
33
+ ],
34
+ is_on_value: true,
35
+ },
36
+ title: 'Title',
37
+ };
38
+ const sensor = {
39
+ is_managed_by_backend: true,
40
+ device_type: '',
41
+ name: 'Sensor name',
42
+ };
43
+
44
+ test('test render without params', async () => {
45
+ await act(async () => {
46
+ tree = await create(<StatesGridActionTemplate />);
47
+ });
48
+ const instance = tree.root;
49
+ const Texts = instance.findAllByType(Text);
50
+ expect(Texts).toHaveLength(1);
51
+ });
52
+
53
+ test('test render with params', async () => {
54
+ await act(async () => {
55
+ tree = await create(
56
+ <StatesGridActionTemplate
57
+ doAction={mockDoAction}
58
+ sensor={sensor}
59
+ actionGroup={actionGroup}
60
+ />
61
+ );
62
+ });
63
+ const instance = tree.root;
64
+ const Texts = instance.findAllByType(Text);
65
+ expect(Texts).toHaveLength(3);
66
+ const TouchableOpacities = instance.findAllByType(TouchableOpacity);
67
+ expect(TouchableOpacities).toHaveLength(2);
68
+ await TouchableOpacities[0].props.onPress();
69
+ expect(mockDoAction).toBeCalledWith(
70
+ mockActionData,
71
+ null,
72
+ `${sensor.name} ${actionGroup.title.toLowerCase()} ${
73
+ actionGroup.configuration.options[0].text
74
+ }`
75
+ );
76
+ });
77
+ });