1 /*
2 * Copyright (c) 2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include <gtest/gtest.h>
17 #include <memory>
18 #include <variant>
19 #include "native_calendar.h"
20 #include "calendar_log.h"
21 #include "native_calendar_manager.h"
22 #include "native_util.h"
23
24 namespace OHOS::CalendarApi::Native {
25 class CalendarTest : public testing::Test {
26 public:
27 /* SetUpTestCase:The preset action of the test suite is executed before the first TestCase */
28 static void SetUpTestSuite(void);
29
30 /* TearDownTestCase:The test suite cleanup action is executed after the last TestCase */
31 static void TearDownTestSuite(void);
32 /* SetUp:Execute before each test case */
SetUp()33 void SetUp() {};
34
35 /* TearDown:Execute after each test case */
TearDown()36 void TearDown() {};
37 static std::shared_ptr<Calendar> calendar;
38 };
39
40 std::shared_ptr<Calendar> CalendarTest::calendar = nullptr;
41 const std::string TEST_NAME = "unit_test";
42 static CalendarAccount account {
43 TEST_NAME,
44 "local",
45 "displayName_unit_test"
46 };
47
SetUpTestSuite(void)48 void CalendarTest::SetUpTestSuite(void)
49 {
50 calendar = CalendarManager::GetInstance().GetCalendar(account);
51 if (calendar != nullptr && calendar->GetAccount().name == TEST_NAME) {
52 CalendarManager::GetInstance().DeleteCalendar(*calendar.get());
53 }
54 calendar = CalendarManager::GetInstance().CreateCalendar(account);
55 ASSERT_TRUE(calendar != nullptr);
56 LOG_INFO("SetUpTestCase SUCCESS");
57 }
58
TearDownTestSuite(void)59 void CalendarTest::TearDownTestSuite(void)
60 {
61 // del calendar will del all event associated
62 LOG_INFO("DeleteCalendar");
63 auto ret = CalendarManager::GetInstance().DeleteCalendar(*calendar.get());
64 ASSERT_TRUE(ret);
65 LOG_INFO("TearDownTestSuite SUCCESS");
66 }
67
68 HWTEST_F(CalendarTest, AddEvent_test_basic, testing::ext::TestSize.Level1)
69 {
70 Event event;
71 event.title = "AddEvent_test_basic";
72 auto eventId = calendar->AddEvent(event);
73 ASSERT_NE(eventId, 0);
74 auto events = calendar->GetEvents(FilterById({eventId}), {});
75 ASSERT_FALSE(events.empty());
76 }
77
78 HWTEST_F(CalendarTest, AddEvent_test_title_is_Chinese, testing::ext::TestSize.Level1)
79 {
80 Event event;
81 event.title = "AddEvent_test_title_is_中文";
82 auto eventId = calendar->AddEvent(event);
83 ASSERT_NE(eventId, 0);
84 auto events = calendar->GetEvents(FilterById({eventId}), {});
85 ASSERT_FALSE(events.empty());
86 }
87
88 HWTEST_F(CalendarTest, DeleteEvent_dupilcate, testing::ext::TestSize.Level1)
89 {
90 Event event;
91 event.title = "DeleteEvent_dupilcate";
92 auto eventId = calendar->AddEvent(event);
93 ASSERT_NE(eventId, 0);
94 auto events = calendar->GetEvents(FilterById({eventId}), {});
95 ASSERT_FALSE(events.empty());
96 auto ret = calendar->DeleteEvent(eventId);
97 EXPECT_EQ(ret, true);
98 ret = calendar->DeleteEvent(eventId);
99 EXPECT_EQ(ret, false);
100 }
101
102 HWTEST_F(CalendarTest, AddEvents_test_normal, testing::ext::TestSize.Level1)
103 {
104 const string title_1 = "AddEvents_test_normal_1";
105 const string title_2 = "AddEvents_test_normal_2";
106 Event event1;
107 event1.title = title_1;
108 Event event2;
109 event2.title = title_2;
110 auto count = calendar->AddEvents({event1, event2});
111 EXPECT_EQ(count, 2);
112 auto queryResult = calendar->GetEvents(FilterByTitle(title_1), {});
113 ASSERT_EQ(1, queryResult.size());
114 EXPECT_EQ(queryResult.at(0).title.value(), title_1);
115 queryResult = calendar->GetEvents(FilterByTitle(title_2), {});
116 ASSERT_EQ(1, queryResult.size());
117 EXPECT_EQ(queryResult.at(0).title.value(), title_2);
118 }
119
120 HWTEST_F(CalendarTest, AddEvents_input_empty, testing::ext::TestSize.Level1)
121 {
122 auto count = calendar->AddEvents({});
123 ASSERT_EQ(count, 0);
124 }
125
126 HWTEST_F(CalendarTest, GetEvent_test_1, testing::ext::TestSize.Level1)
127 {
128 Event event;
129 const string title = "GetEvent_test_1";
130 event.title = title;
131 event.type = EventType::Important;
132 Location testLocation { "test", 123, 456 };
133 event.location = std::make_optional<Location>(testLocation);
134 event.startTime = 1766620800000;
135 event.endTime = 1766620800000;
136 event.isAllDay = true;
137 event.attendees = {{"xiaoming", "xiaoming@abc.com", NONE, UNKNOWN, REQUIRED},
138 {"xiaoqiang", "test_attendee1@abc.com", PARTICIPANT, TENTATIVE, OPTIONAL},
139 {"abc", "test_attendee2@abc.com", ORGANIZER, ACCEPTED, RESOURCE}};
140 event.timeZone = "UTC";
141 event.reminderTime = {0, 1, 2};
142 event.description = "UpdateEvent_test_2_disp";
143 const auto eventId = calendar->AddEvent(event);
144 ASSERT_NE(eventId, 0);
145 const auto events = calendar->GetEvents(FilterByTitle(title), {});
146 ASSERT_EQ(1, events.size());
147 const auto newEvent = events.at(0);
148 EXPECT_EQ(newEvent.title, event.title);
149 EXPECT_EQ(newEvent.type, event.type);
150 EXPECT_EQ(newEvent.location, event.location);
151 EXPECT_EQ(newEvent.startTime, event.startTime);
152 EXPECT_EQ(newEvent.endTime, event.endTime);
153 EXPECT_EQ(newEvent.isAllDay, event.isAllDay);
154 EXPECT_EQ(newEvent.attendees, event.attendees);
155 EXPECT_EQ(newEvent.timeZone, event.timeZone);
156 EXPECT_EQ(newEvent.reminderTime, event.reminderTime);
157 EXPECT_EQ(newEvent.description, event.description);
158 }
159
160 HWTEST_F(CalendarTest, UpdateEvent_test_1, testing::ext::TestSize.Level1)
161 {
162 Event event;
163 event.title = "UpdateEvent_test_1";
164 auto eventId = calendar->AddEvent(event);
165 ASSERT_NE(eventId, 0);
166 auto events = calendar->GetEvents(FilterById({eventId}), {});
167 ASSERT_EQ(1, events.size());
168 auto newEvent = events.at(0);
169 string_view newTitle = "UpdateEvent_test_1_new";
170 newEvent.title = newTitle;
171 auto ret = calendar->UpdateEvent(newEvent);
172 EXPECT_EQ(ret, true);
173 events = calendar->GetEvents(FilterByTitle(newTitle), {});
174 ASSERT_EQ(1, events.size());
175 EXPECT_EQ(events.at(0).title.value(), newTitle);
176 }
177
178 HWTEST_F(CalendarTest, UpdateEvents_test_1, testing::ext::TestSize.Level1)
179 {
180 Event event1;
181 event1.title = "UpdateEvents_test_1";
182 Event event2;
183 event2.title = "UpdateEvents_test_2";
184 auto count = calendar->AddEvents({event1, event2});
185 EXPECT_EQ(count, 2);
186
187 auto queryResult = calendar->GetEvents(FilterByTitle("UpdateEvents_test_1"), {});
188 ASSERT_EQ(1, queryResult.size());
189
190 auto newEvent1 = queryResult.at(0);
191 newEvent1.title = "title_test_update_1_new";
192 queryResult = calendar->GetEvents(FilterByTitle("UpdateEvents_test_2"), {});
193 ASSERT_EQ(1, queryResult.size());
194 auto newEvent2 = queryResult.at(0);
195 newEvent2.title = "title_test_update_2_new";
196 std::vector<Event> newEvents;
197 newEvents.emplace_back(newEvent1);
198 newEvents.emplace_back(newEvent2);
199 count = calendar->UpdateEvents(newEvents);
200 EXPECT_EQ(count, newEvents.size());
201 auto delRet = calendar->DeleteEvents({newEvent1.id.value(), newEvent2.id.value()});
202 ASSERT_EQ(delRet, newEvents.size());
203 }
204
205 HWTEST_F(CalendarTest, GetConfig_default_test, testing::ext::TestSize.Level1)
206 {
207 auto config = calendar->GetConfig();
208 EXPECT_TRUE(config.enableReminder.has_value());
209 EXPECT_TRUE(std::get<1>(config.color) == 0);
210 }
211
212 HWTEST_F(CalendarTest, SetConfig_empty_param_test, testing::ext::TestSize.Level1)
213 {
214 CalendarConfig config;
215 auto ret = calendar->SetConfig(config);
216 ASSERT_TRUE(ret);
217 auto configExpect = calendar->GetConfig();
218 EXPECT_TRUE(configExpect.enableReminder.has_value());
219 EXPECT_TRUE(std::get<0>(config.color).empty());
220 }
221
222 HWTEST_F(CalendarTest, SetConfig_with_color_test, testing::ext::TestSize.Level1)
223 {
224 CalendarConfig config;
225 config.color = 0xaabbcc;
226 config.enableReminder = false;
227 ASSERT_TRUE(calendar->SetConfig(config));
228 auto configExpect = calendar->GetConfig();
229 EXPECT_EQ(config, configExpect);
230 config.color = 0xaabbccdd;
231 config.enableReminder = true;
232 ASSERT_TRUE(calendar->SetConfig(config));
233 configExpect = calendar->GetConfig();
234 EXPECT_EQ(config, configExpect);
235 }
236
237 HWTEST_F(CalendarTest, UpdateEvent_test_3, testing::ext::TestSize.Level1)
238 {
239 Event event;
240 RecurrenceRule recurrenceRule;
241 recurrenceRule.recurrenceFrequency = YEARLY;
242 recurrenceRule.daysOfWeek = {1, 3, 5};
243 recurrenceRule.weeksOfMonth = {2, 3, 4};
244 recurrenceRule.monthsOfYear = {6, 7, 8};
245 recurrenceRule.excludedDates = {1713672150000};
246 event.recurrenceRule = std::make_optional<RecurrenceRule>(recurrenceRule);
247 event.title = std::make_optional<std::string>("UpdateEvent_test_3");
248 event.isLunar = std::make_optional<bool>(true);
249 auto eventId = calendar->AddEvent(event);
250 auto events = calendar->GetEvents(FilterById({eventId}), {"recurrenceRule", "identifier", "isLunar", "id"});
251 ASSERT_NE(eventId, 0);
252 }
253
254 HWTEST_F(CalendarTest, AddEventInfoNoID, testing::ext::TestSize.Level1)
255 {
256 Event event;
257 RecurrenceRule recurrenceRule;
258 recurrenceRule.recurrenceFrequency = YEARLY;
259 recurrenceRule.daysOfWeek = {1, 3, 5};
260 recurrenceRule.weeksOfMonth = {2, 3, 4};
261 recurrenceRule.monthsOfYear = {6, 7, 8};
262 recurrenceRule.excludedDates = {1713672150000};
263 event.recurrenceRule = std::make_optional<RecurrenceRule>(recurrenceRule);
264 int channelId = 0;
265 int eventInfo = calendar->AddEventInfo(event, channelId);
266 ASSERT_NE(eventInfo, 0);
267 }
268
269 HWTEST_F(CalendarTest, UpdateEventNoID, testing::ext::TestSize.Level1)
270 {
271 Event event;
272 bool isUpdataEvent = calendar->UpdateEvent(event);
273 ASSERT_EQ(isUpdataEvent, 0);
274 }
275
276 HWTEST_F(CalendarTest, BuildValueEventIsLunar, testing::ext::TestSize.Level1)
277 {
278 Event event;
279 event.identifier = std::make_optional<std::string>("1111");
280 event.isLunar = std::make_optional<bool>(true);
281 DataShare::DataShareValuesBucket newShareValuesBucket;
282 newShareValuesBucket.Put("identifier", event.identifier.value());
283 newShareValuesBucket.Put("event_calendar_type", event.isLunar.value());
284 auto shareValuesBucket = BuildValueEvent(event, 0, 0);
285 auto itIdentifier = shareValuesBucket.valuesMap.find("identifier");
286 auto *itIdentifierVal = std::get_if<std::string>(&itIdentifier->second);
287 std::string identifierVal = *itIdentifierVal;
288 auto itIsLunar = shareValuesBucket.valuesMap.find("event_calendar_type");
289 auto *itIsLunarVal = std::get_if<bool>(&itIsLunar->second);
290 bool isLunarVal = *itIsLunarVal;
291 EXPECT_EQ(event.identifier.value(), identifierVal);
292 EXPECT_EQ(event.isLunar.value(), isLunarVal);
293 }
294
295 } // namespace OHOS::CalendarApi::Native
296