• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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