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.12, 45.45};
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, UpdateEvent_DeleteLocation_test, testing::ext::TestSize.Level0)
179 {
180 Event event;
181 event.title = "UpdateEvent_Location";
182 event.location = {"test", 123.12, 45.45};
183 auto eventId = calendar->AddEvent(event);
184 ASSERT_NE(eventId, 0);
185 auto events = calendar->GetEvents(FilterById({eventId}), {});
186 ASSERT_EQ(1, events.size());
187 auto newEvent = events.at(0);
188 newEvent.location = std::make_optional<Location>();
189 auto ret = calendar->UpdateEvent(newEvent);
190 EXPECT_EQ(ret, true);
191 events = calendar->GetEvents(FilterById({eventId}), {});
192 ASSERT_EQ(1, events.size());
193 auto newLocation = events.at(0).location.value();
194 EXPECT_EQ(newLocation.location.has_value(), true);
195 EXPECT_EQ(newLocation.location.value(), "");
196 EXPECT_EQ(newLocation.longitude.has_value(), false);
197 EXPECT_EQ(newLocation.latitude.has_value(), false);
198 }
199
200 HWTEST_F(CalendarTest, UpdateEvent_AddLocation_test, testing::ext::TestSize.Level0)
201 {
202 Event event;
203 event.title = "UpdateEvent_AddLocation_test";
204 auto eventId = calendar->AddEvent(event);
205 ASSERT_NE(eventId, 0);
206 auto events = calendar->GetEvents(FilterById({eventId}), {});
207 ASSERT_EQ(1, events.size());
208 auto newEvent = events.at(0);
209 EXPECT_EQ(newEvent.location.has_value(), true);
210 EXPECT_EQ(newEvent.location.value().location.has_value(), true);
211 EXPECT_EQ(newEvent.location.value().longitude.has_value(), false);
212 newEvent.location = {"test", 123.12, 45.45};
213 auto ret = calendar->UpdateEvent(newEvent);
214
215 EXPECT_EQ(ret, true);
216 events = calendar->GetEvents(FilterById({eventId}), {});
217 ASSERT_EQ(1, events.size());
218 auto newLocation = events.at(0).location.value();
219 EXPECT_EQ(newLocation.location.value(), newEvent.location.value().location.value());
220 EXPECT_EQ(newLocation.longitude.value(), newEvent.location.value().longitude.value());
221 EXPECT_EQ(newLocation.latitude.value(), newEvent.location.value().latitude.value());
222 }
223
224 HWTEST_F(CalendarTest, UpdateEvent_DeleteRule, testing::ext::TestSize.Level1)
225 {
226 Event event;
227 event.title = "UpdateEvent_DeleteRule";
228 RecurrenceRule recurrenceRule;
229 recurrenceRule.recurrenceFrequency = YEARLY;
230 recurrenceRule.daysOfWeek = {1, 3, 5};
231 recurrenceRule.weeksOfMonth = {2, 3, 4};
232 recurrenceRule.monthsOfYear = {6, 7, 8};
233 event.recurrenceRule = std::make_optional<RecurrenceRule>(recurrenceRule);
234 auto eventId = calendar->AddEvent(event);
235 ASSERT_NE(eventId, 0);
236 auto events = calendar->GetEvents(FilterById({eventId}), {"recurrenceRule"});
237 ASSERT_EQ(1, events.size());
238 auto newEvent = events.at(0);
239 newEvent.recurrenceRule.value().recurrenceFrequency = NORULE;
240 auto ret = calendar->UpdateEvent(newEvent);
241 EXPECT_EQ(ret, true);
242 events = calendar->GetEvents(FilterById({eventId}), {"recurrenceRule"});
243 ASSERT_EQ(1, events.size());
244 auto newRecurrenceRule = events.at(0).recurrenceRule.value();
245 EXPECT_EQ(newRecurrenceRule.recurrenceFrequency, NORULE);
246 EXPECT_EQ(newRecurrenceRule.daysOfWeek.has_value(), false);
247 EXPECT_EQ(newRecurrenceRule.weeksOfMonth.has_value(), false);
248 EXPECT_EQ(newRecurrenceRule.monthsOfYear.has_value(), false);
249 }
250
251 HWTEST_F(CalendarTest, UpdateEvent_AddRule, testing::ext::TestSize.Level1)
252 {
253 Event event;
254 event.title = "UpdateEvent_DeleteRule";
255 auto eventId = calendar->AddEvent(event);
256 ASSERT_NE(eventId, 0);
257 auto events = calendar->GetEvents(FilterById({eventId}), {"recurrenceRule"});
258 ASSERT_EQ(1, events.size());
259 auto newEvent = events.at(0);
260 EXPECT_EQ(newEvent.recurrenceRule.value().recurrenceFrequency, NORULE);
261 RecurrenceRule recurrenceRule;
262 recurrenceRule.recurrenceFrequency = YEARLY;
263 recurrenceRule.daysOfWeek = {1, 3, 5};
264 recurrenceRule.weeksOfMonth = {2, 3, 4};
265 recurrenceRule.monthsOfYear = {6, 7, 8};
266 newEvent.recurrenceRule = std::make_optional<RecurrenceRule>(recurrenceRule);
267
268 auto ret = calendar->UpdateEvent(newEvent);
269 EXPECT_EQ(ret, true);
270 events = calendar->GetEvents(FilterById({eventId}), {"recurrenceRule"});
271 ASSERT_EQ(1, events.size());
272 auto newRecurrenceRule = events.at(0).recurrenceRule.value();
273 EXPECT_EQ(newRecurrenceRule.recurrenceFrequency, YEARLY);
274
275 for (int i = 0; i < newRecurrenceRule.weeksOfMonth.value().size(); i++) {
276 EXPECT_EQ(newRecurrenceRule.daysOfWeek.value()[i], recurrenceRule.daysOfWeek.value()[i]);
277 EXPECT_EQ(newRecurrenceRule.weeksOfMonth.value()[i], recurrenceRule.weeksOfMonth.value()[i]);
278 EXPECT_EQ(newRecurrenceRule.monthsOfYear.value()[i], recurrenceRule.monthsOfYear.value()[i]);
279 }
280 }
281
282 HWTEST_F(CalendarTest, UpdateEvent_Title, testing::ext::TestSize.Level1)
283 {
284 Event event;
285 event.title = "UpdateEvent_Title";
286 auto eventId = calendar->AddEvent(event);
287 ASSERT_NE(eventId, 0);
288 auto events = calendar->GetEvents(FilterById({eventId}), {});
289 ASSERT_EQ(1, events.size());
290 auto newEvent = events.at(0);
291 auto ret = calendar->UpdateEvent(newEvent);
292 EXPECT_EQ(ret, true);
293 events = calendar->GetEvents(FilterByTitle(newEvent.title.value()), {});
294 ASSERT_EQ(1, events.size());
295 EXPECT_EQ(events.at(0).title.value(), event.title.value());
296 }
297
298 HWTEST_F(CalendarTest, UpdateEvent_AddService, testing::ext::TestSize.Level1)
299 {
300 Event event;
301 event.title = "UpdateEvent_AddService";
302 auto eventId = calendar->AddEvent(event);
303 ASSERT_NE(eventId, 0);
304 auto events = calendar->GetEvents(FilterById({eventId}), {});
305 ASSERT_EQ(1, events.size());
306 EXPECT_EQ(events.at(0).service.has_value(), false);
307 auto newEvent = events.at(0);
308 EventService testService {
309 "Meeting",
310 "//testuri",
311 "test_discription"
312 };
313 newEvent.service = std::make_optional<EventService>(testService);
314 auto ret = calendar->UpdateEvent(newEvent);
315 EXPECT_EQ(ret, true);
316 events = calendar->GetEvents(FilterById({eventId}), {});
317 ASSERT_EQ(1, events.size());
318 auto newService = events.at(0).service.value();
319 EXPECT_EQ(newService.type, testService.type);
320 EXPECT_EQ(newService.uri, testService.uri);
321 EXPECT_EQ(newService.description.value(), testService.description.value());
322 }
323
324 HWTEST_F(CalendarTest, UpdateEvent_DeleteService, testing::ext::TestSize.Level1)
325 {
326 Event event;
327 event.title = "UpdateEvent_DeleteService";
328 EventService testService {
329 "Meeting",
330 "//testuri",
331 "test_discription"
332 };
333 event.service = std::make_optional<EventService>(testService);
334 auto eventId = calendar->AddEvent(event);
335 ASSERT_NE(eventId, 0);
336 auto events = calendar->GetEvents(FilterById({eventId}), {});
337 ASSERT_EQ(1, events.size());
338 EXPECT_EQ(events.at(0).service.has_value(), true);
339 auto addService = events.at(0).service.value();
340 EXPECT_EQ(addService.type, testService.type);
341 EXPECT_EQ(addService.uri, testService.uri);
342 EXPECT_EQ(addService.description.value(), testService.description.value());
343 auto newEvent = events.at(0);
344 EventService testNewService {
345 "Meeting",
346 "",
347 std::nullopt
348 };
349 newEvent.service = std::make_optional<EventService>(testNewService);
350 auto ret = calendar->UpdateEvent(newEvent);
351 EXPECT_EQ(ret, true);
352 events = calendar->GetEvents(FilterById({eventId}), {});
353 ASSERT_EQ(1, events.size());
354 ASSERT_EQ(events.at(0).service.has_value(), true);
355 auto newService = events.at(0).service.value();
356 EXPECT_EQ(newService.type, testNewService.type);
357 EXPECT_EQ(newService.uri, testNewService.uri);
358 EXPECT_EQ(newService.description.has_value(), true);
359 EXPECT_EQ(newService.description.value(), "");
360 }
361
362 HWTEST_F(CalendarTest, UpdateEvents_test_1, testing::ext::TestSize.Level1)
363 {
364 Event event1;
365 event1.title = "UpdateEvents_test_1";
366 Event event2;
367 event2.title = "UpdateEvents_test_2";
368 auto count = calendar->AddEvents({event1, event2});
369 EXPECT_EQ(count, 2);
370
371 auto queryResult = calendar->GetEvents(FilterByTitle("UpdateEvents_test_1"), {});
372 ASSERT_EQ(1, queryResult.size());
373
374 auto newEvent1 = queryResult.at(0);
375 newEvent1.title = "title_test_update_1_new";
376 queryResult = calendar->GetEvents(FilterByTitle("UpdateEvents_test_2"), {});
377 ASSERT_EQ(1, queryResult.size());
378 auto newEvent2 = queryResult.at(0);
379 newEvent2.title = "title_test_update_2_new";
380 std::vector<Event> newEvents;
381 newEvents.emplace_back(newEvent1);
382 newEvents.emplace_back(newEvent2);
383 count = calendar->UpdateEvents(newEvents);
384 EXPECT_EQ(count, newEvents.size());
385 auto delRet = calendar->DeleteEvents({newEvent1.id.value(), newEvent2.id.value()});
386 ASSERT_EQ(delRet, newEvents.size());
387 }
388
389 HWTEST_F(CalendarTest, GetConfig_default_test, testing::ext::TestSize.Level1)
390 {
391 auto config = calendar->GetConfig();
392 EXPECT_TRUE(config.enableReminder.has_value());
393 EXPECT_TRUE(std::get<1>(config.color) == 0);
394 }
395
396 HWTEST_F(CalendarTest, SetConfig_empty_param_test, testing::ext::TestSize.Level1)
397 {
398 CalendarConfig config;
399 auto ret = calendar->SetConfig(config);
400 ASSERT_TRUE(ret);
401 auto configExpect = calendar->GetConfig();
402 EXPECT_TRUE(configExpect.enableReminder.has_value());
403 EXPECT_TRUE(std::get<0>(config.color).empty());
404 }
405
406 HWTEST_F(CalendarTest, SetConfig_with_color_test, testing::ext::TestSize.Level1)
407 {
408 CalendarConfig config;
409 config.color = 0xaabbcc;
410 config.enableReminder = false;
411 ASSERT_TRUE(calendar->SetConfig(config));
412 auto configExpect = calendar->GetConfig();
413 EXPECT_EQ(config, configExpect);
414 config.color = 0xaabbccdd;
415 config.enableReminder = true;
416 ASSERT_TRUE(calendar->SetConfig(config));
417 configExpect = calendar->GetConfig();
418 EXPECT_EQ(config, configExpect);
419 }
420
421 HWTEST_F(CalendarTest, UpdateEvent_test_3, testing::ext::TestSize.Level1)
422 {
423 Event event;
424 RecurrenceRule recurrenceRule;
425 recurrenceRule.recurrenceFrequency = YEARLY;
426 recurrenceRule.daysOfWeek = {1, 3, 5};
427 recurrenceRule.weeksOfMonth = {2, 3, 4};
428 recurrenceRule.monthsOfYear = {6, 7, 8};
429 recurrenceRule.excludedDates = {1713672150000};
430 event.recurrenceRule = std::make_optional<RecurrenceRule>(recurrenceRule);
431 event.title = std::make_optional<std::string>("UpdateEvent_test_3");
432 event.isLunar = std::make_optional<bool>(true);
433 auto eventId = calendar->AddEvent(event);
434 auto events = calendar->GetEvents(FilterById({eventId}), {"recurrenceRule", "identifier", "isLunar", "id"});
435 ASSERT_NE(eventId, 0);
436 }
437
438 HWTEST_F(CalendarTest, AddEventInfoNoID, testing::ext::TestSize.Level1)
439 {
440 Event event;
441 RecurrenceRule recurrenceRule;
442 recurrenceRule.recurrenceFrequency = YEARLY;
443 recurrenceRule.daysOfWeek = {1, 3, 5};
444 recurrenceRule.weeksOfMonth = {2, 3, 4};
445 recurrenceRule.monthsOfYear = {6, 7, 8};
446 recurrenceRule.excludedDates = {1713672150000};
447 event.recurrenceRule = std::make_optional<RecurrenceRule>(recurrenceRule);
448 int channelId = 0;
449 int eventInfo = calendar->AddEventInfo(event, channelId);
450 ASSERT_NE(eventInfo, 0);
451 }
452
453 HWTEST_F(CalendarTest, UpdateEventNoID, testing::ext::TestSize.Level1)
454 {
455 Event event;
456 bool isUpdataEvent = calendar->UpdateEvent(event);
457 ASSERT_EQ(isUpdataEvent, 0);
458 }
459
460 HWTEST_F(CalendarTest, BuildValueEventIsLunar, testing::ext::TestSize.Level1)
461 {
462 Event event;
463 event.identifier = std::make_optional<std::string>("1111");
464 event.isLunar = std::make_optional<bool>(true);
465 DataShare::DataShareValuesBucket newShareValuesBucket;
466 newShareValuesBucket.Put("identifier", event.identifier.value());
467 newShareValuesBucket.Put("event_calendar_type", event.isLunar.value());
468 auto shareValuesBucket = BuildValueEvent(event, 0, 0, false);
469 auto itIdentifier = shareValuesBucket.valuesMap.find("identifier");
470 auto *itIdentifierVal = std::get_if<std::string>(&itIdentifier->second);
471 std::string identifierVal = *itIdentifierVal;
472 auto itIsLunar = shareValuesBucket.valuesMap.find("event_calendar_type");
473 auto *itIsLunarVal = std::get_if<bool>(&itIsLunar->second);
474 bool isLunarVal = *itIsLunarVal;
475 EXPECT_EQ(event.identifier.value(), identifierVal);
476 EXPECT_EQ(event.isLunar.value(), isLunarVal);
477 }
478
479 } // namespace OHOS::CalendarApi::Native
480