Browse Source

Added more tests

Arnaud Vergnet 4 years ago
parent
commit
0b84da8b93

+ 2
- 2
components/PreviewEventDashboardItem.js View File

@@ -26,12 +26,12 @@ function PreviewEventDashboardItem(props) {
26 26
                 {hasImage ?
27 27
                     <Card.Title
28 28
                         title={props.event['title']}
29
-                        subtitle={PlanningEventManager.getFormattedEventTime(props.event)}
29
+                        subtitle={PlanningEventManager.getFormattedEventTime(props.event['date_begin'], props.event['date_end'])}
30 30
                         left={getImage}
31 31
                     /> :
32 32
                     <Card.Title
33 33
                         title={props.event['title']}
34
-                        subtitle={PlanningEventManager.getFormattedEventTime(props.event)}
34
+                        subtitle={PlanningEventManager.getFormattedEventTime(props.event['date_begin'], props.event['date_end'])}
35 35
                     />}
36 36
                 {!isEmpty ?
37 37
                     <Card.Content style={{

+ 6
- 22
screens/HomeScreen.js View File

@@ -10,6 +10,7 @@ import {Text, withTheme} from 'react-native-paper';
10 10
 import FeedItem from "../components/FeedItem";
11 11
 import SquareDashboardItem from "../components/SquareDashboardItem";
12 12
 import PreviewEventDashboardItem from "../components/PreviewEventDashboardItem";
13
+import PlanningEventManager from "../utils/PlanningEventManager";
13 14
 // import DATA from "../dashboard_data.json";
14 15
 
15 16
 
@@ -153,23 +154,6 @@ class HomeScreen extends React.Component<Props> {
153 154
     }
154 155
 
155 156
     /**
156
-     * Convert the date string given by in the event list json to a date object
157
-     * @param dateString
158
-     * @return {Date}
159
-     */
160
-    stringToDate(dateString: ?string): ?Date {
161
-        let date = new Date();
162
-        if (dateString === undefined || dateString === null)
163
-            date = undefined;
164
-        else if (dateString.split(' ').length > 1) {
165
-            let timeStr = dateString.split(' ')[1];
166
-            date.setHours(parseInt(timeStr.split(':')[0]), parseInt(timeStr.split(':')[1]), 0);
167
-        } else
168
-            date = undefined;
169
-        return date;
170
-    }
171
-
172
-    /**
173 157
      * Get the time limit depending on the current day:
174 158
      * 17:30 for every day of the week except for thursday 11:30
175 159
      * 00:00 on weekends
@@ -191,8 +175,8 @@ class HomeScreen extends React.Component<Props> {
191 175
      * @return {number} The number of milliseconds
192 176
      */
193 177
     getEventDuration(event: Object): number {
194
-        let start = this.stringToDate(event['date_begin']);
195
-        let end = this.stringToDate(event['date_end']);
178
+        let start = PlanningEventManager.stringToDate(event['date_begin']);
179
+        let end = PlanningEventManager.stringToDate(event['date_end']);
196 180
         let duration = 0;
197 181
         if (start !== undefined && start !== null && end !== undefined && end !== null)
198 182
             duration = end - start;
@@ -209,7 +193,7 @@ class HomeScreen extends React.Component<Props> {
209 193
     getEventsAfterLimit(events: Object, limit: Date): Array<Object> {
210 194
         let validEvents = [];
211 195
         for (let event of events) {
212
-            let startDate = this.stringToDate(event['date_begin']);
196
+            let startDate = PlanningEventManager.stringToDate(event['date_begin']);
213 197
             if (startDate !== undefined && startDate !== null && startDate >= limit) {
214 198
                 validEvents.push(event);
215 199
             }
@@ -244,8 +228,8 @@ class HomeScreen extends React.Component<Props> {
244 228
         let validEvents = [];
245 229
         let now = new Date();
246 230
         for (let event of events) {
247
-            let startDate = this.stringToDate(event['date_begin']);
248
-            let endDate = this.stringToDate(event['date_end']);
231
+            let startDate = PlanningEventManager.stringToDate(event['date_begin']);
232
+            let endDate = PlanningEventManager.stringToDate(event['date_end']);
249 233
             if (startDate !== undefined && startDate !== null) {
250 234
                 if (startDate > now)
251 235
                     validEvents.push(event);

+ 90
- 22
utils/PlanningEventManager.js View File

@@ -1,5 +1,8 @@
1
-
2 1
 export default class PlanningEventManager {
2
+
3
+    // Regex used to check date string validity
4
+    static dateRegExp = /^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/;
5
+
3 6
     static isEventBefore(event1: Object, event2: Object) {
4 7
         let date1 = new Date();
5 8
         let date2 = new Date();
@@ -41,39 +44,104 @@ export default class PlanningEventManager {
41 44
     }
42 45
 
43 46
     /**
44
-     * Convert the date string given by in the event list json to a date object
45
-     * @param dateString
46
-     * @return {Date}
47
+     * Checks if the given date string is in the format
48
+     * YYYY-MM-DD HH:MM:SS
49
+     *
50
+     * @param dateString The string to check
51
+     * @return {boolean}
47 52
      */
48
-    static stringToDate(dateString: ?string): ?Date {
53
+    static isDateStringFormatValid(dateString: ?string) {
54
+        return dateString !== undefined
55
+            && dateString !== null
56
+            && PlanningEventManager.dateRegExp.test(dateString);
57
+    }
58
+
59
+    /**
60
+     * Converts the given date string to a date object.<br>
61
+     * Accepted format: YYYY-MM-DD HH:MM:SS
62
+     *
63
+     * @param dateString The string to convert
64
+     * @return {Date} The date object or undefined if the given string is invalid
65
+     */
66
+    static stringToDate(dateString: ?string): Date | undefined {
49 67
         let date = new Date();
50
-        if (dateString === undefined || dateString === null)
51
-            date = undefined;
52
-        else if (dateString.split(' ').length > 1) {
53
-            let timeStr = dateString.split(' ')[1];
54
-            date.setHours(parseInt(timeStr.split(':')[0]), parseInt(timeStr.split(':')[1]), 0);
68
+        if (PlanningEventManager.isDateStringFormatValid(dateString)) {
69
+            let stringArray = dateString.split(' ');
70
+            let dateArray = stringArray[0].split('-');
71
+            let timeArray = stringArray[1].split(':');
72
+            date.setFullYear(
73
+                parseInt(dateArray[0]),
74
+                parseInt(dateArray[1]) - 1, // Month range from 0 to 11
75
+                parseInt(dateArray[2])
76
+            );
77
+            date.setHours(
78
+                parseInt(timeArray[0]),
79
+                parseInt(timeArray[1]),
80
+                parseInt(timeArray[2]),
81
+                0,
82
+            );
55 83
         } else
56 84
             date = undefined;
85
+
57 86
         return date;
58 87
     }
59 88
 
60
-    static padStr(i: number) {
61
-        return (i < 10) ? "0" + i : "" + i;
89
+    /**
90
+     * Returns a padded string for the given number if it is lower than 10
91
+     *
92
+     * @param i The string to be converted
93
+     * @return {string}
94
+     */
95
+    static toPaddedString(i: number): string {
96
+        return (i < 10 && i >= 0) ? "0" + i.toString(10) : i.toString(10);
62 97
     }
63 98
 
64
-    static getFormattedEventTime(event: Object): string {
65
-        let formattedStr = '';
66
-        let startDate = PlanningEventManager.stringToDate(event['date_begin']);
67
-        let endDate = PlanningEventManager.stringToDate(event['date_end']);
68
-        if (startDate !== undefined && startDate !== null && endDate !== undefined && endDate !== null)
69
-            formattedStr = PlanningEventManager.padStr(startDate.getHours()) + ':' + PlanningEventManager.padStr(startDate.getMinutes()) +
70
-                ' - ' + PlanningEventManager.padStr(endDate.getHours()) + ':' + PlanningEventManager.padStr(endDate.getMinutes());
71
-        else if (startDate !== undefined && startDate !== null)
72
-            formattedStr = PlanningEventManager.padStr(startDate.getHours()) + ':' + PlanningEventManager.padStr(startDate.getMinutes());
99
+    /**
100
+     * Returns a string corresponding to the event start and end times in the following format:
101
+     *
102
+     * HH:MM - HH:MM
103
+     *
104
+     * If the end date is not specified or is equal to start time, only start time will be shown.
105
+     *
106
+     * If the end date is not on the same day, 00:00 will be shown as end time
107
+     *
108
+     * @param start Start time in YYYY-MM-DD HH:MM:SS format
109
+     * @param end End time in YYYY-MM-DD HH:MM:SS format
110
+     * @return {string} Formatted string or "/ - /" on error
111
+     */
112
+    static getFormattedEventTime(start: ?string, end: ?string): string {
113
+        let formattedStr = '/ - /';
114
+        let startDate = PlanningEventManager.stringToDate(start);
115
+        let endDate = PlanningEventManager.stringToDate(end);
116
+
117
+        if (startDate !== undefined && endDate !== undefined && startDate.getTime() !== endDate.getTime()) {
118
+            formattedStr = PlanningEventManager.toPaddedString(startDate.getHours()) + ':'
119
+                + PlanningEventManager.toPaddedString(startDate.getMinutes()) + ' - ';
120
+            if (endDate.getFullYear() > startDate.getFullYear()
121
+                || endDate.getMonth() > startDate.getMonth()
122
+                || endDate.getDate() > startDate.getDate())
123
+                formattedStr += '00:00';
124
+            else
125
+                formattedStr += PlanningEventManager.toPaddedString(endDate.getHours()) + ':'
126
+                    + PlanningEventManager.toPaddedString(endDate.getMinutes());
127
+        } else if (startDate !== undefined)
128
+            formattedStr =
129
+                PlanningEventManager.toPaddedString(startDate.getHours()) + ':'
130
+                + PlanningEventManager.toPaddedString(startDate.getMinutes());
131
+
73 132
         return formattedStr
74 133
     }
75 134
 
76
-    static isDescriptionEmpty (description: ?string) {
135
+    /**
136
+     * Checks if the given description can be considered empty.
137
+     * <br>
138
+     * An empty description is composed only of whitespace, <b>br</b> or <b>p</b> tags
139
+     *
140
+     *
141
+     * @param description The text to check
142
+     * @return {boolean}
143
+     */
144
+    static isDescriptionEmpty(description: ?string): boolean {
77 145
         if (description !== undefined && description !== null) {
78 146
             return description
79 147
                 .split('<p>').join('') // Equivalent to a replace all

+ 64
- 0
utils/__test__/PlanningEventManager.test.js View File

@@ -16,4 +16,68 @@ test('isDescriptionEmpty', () => {
16 16
     expect(PlanningEventManager.isDescriptionEmpty("<p>coucou</p>")).toBeFalse();
17 17
 });
18 18
 
19
+test('toPaddedString', () => {
20
+    expect(PlanningEventManager.toPaddedString(-1)).toBe("-1");
21
+    expect(PlanningEventManager.toPaddedString(0)).toBe("00");
22
+    expect(PlanningEventManager.toPaddedString(1)).toBe("01");
23
+    expect(PlanningEventManager.toPaddedString(2)).toBe("02");
24
+    expect(PlanningEventManager.toPaddedString(10)).toBe("10");
25
+    expect(PlanningEventManager.toPaddedString(53)).toBe("53");
26
+    expect(PlanningEventManager.toPaddedString(100)).toBe("100");
27
+});
28
+
29
+test('isDateStringFormatValid', () => {
30
+    expect(PlanningEventManager.isDateStringFormatValid("2020-03-21 09:00:00")).toBeTrue();
31
+    expect(PlanningEventManager.isDateStringFormatValid("3214-64-12 01:16:65")).toBeTrue();
32
+
33
+    expect(PlanningEventManager.isDateStringFormatValid("3214-64-12 1:16:65")).toBeFalse();
34
+    expect(PlanningEventManager.isDateStringFormatValid("3214-f4-12 01:16:65")).toBeFalse();
35
+    expect(PlanningEventManager.isDateStringFormatValid("sqdd 09:00:00")).toBeFalse();
36
+    expect(PlanningEventManager.isDateStringFormatValid("2020-03-21")).toBeFalse();
37
+    expect(PlanningEventManager.isDateStringFormatValid("2020-03-21 truc")).toBeFalse();
38
+    expect(PlanningEventManager.isDateStringFormatValid("3214-64-12 1:16:65")).toBeFalse();
39
+    expect(PlanningEventManager.isDateStringFormatValid("garbage")).toBeFalse();
40
+    expect(PlanningEventManager.isDateStringFormatValid("")).toBeFalse();
41
+    expect(PlanningEventManager.isDateStringFormatValid(undefined)).toBeFalse();
42
+    expect(PlanningEventManager.isDateStringFormatValid(null)).toBeFalse();
43
+});
44
+
45
+test('stringToDate', () => {
46
+    let testDate = new Date();
47
+    expect(PlanningEventManager.stringToDate(undefined)).toBeUndefined();
48
+    expect(PlanningEventManager.stringToDate("")).toBeUndefined();
49
+    expect(PlanningEventManager.stringToDate("garbage")).toBeUndefined();
50
+    expect(PlanningEventManager.stringToDate("2020-03-21")).toBeUndefined();
51
+    expect(PlanningEventManager.stringToDate("09:00:00")).toBeUndefined();
52
+    expect(PlanningEventManager.stringToDate("2020-03-21 09:g0:00")).toBeUndefined();
53
+    expect(PlanningEventManager.stringToDate("2020-03-21 09:g0:")).toBeUndefined();
54
+    testDate.setFullYear(2020, 2, 21);
55
+    testDate.setHours(9, 0, 0, 0);
56
+    expect(PlanningEventManager.stringToDate("2020-03-21 09:00:00")).toEqual(testDate);
57
+    testDate.setFullYear(2020, 0, 31);
58
+    testDate.setHours(18, 30, 50, 0);
59
+    expect(PlanningEventManager.stringToDate("2020-01-31 18:30:50")).toEqual(testDate);
60
+    testDate.setFullYear(2020, 50, 50);
61
+    testDate.setHours(65, 65, 65, 0);
62
+    expect(PlanningEventManager.stringToDate("2020-51-50 65:65:65")).toEqual(testDate);
63
+});
64
+
65
+test('getFormattedEventTime', () => {
66
+    expect(PlanningEventManager.getFormattedEventTime(null, null))
67
+        .toBe('/ - /');
68
+    expect(PlanningEventManager.getFormattedEventTime(undefined, undefined))
69
+        .toBe('/ - /');
70
+    expect(PlanningEventManager.getFormattedEventTime("20:30:00", "23:00:00"))
71
+        .toBe('/ - /');
72
+    expect(PlanningEventManager.getFormattedEventTime("2020-03-30", "2020-03-31"))
73
+        .toBe('/ - /');
74
+
75
+
76
+    expect(PlanningEventManager.getFormattedEventTime("2020-03-21 09:00:00", "2020-03-21 09:00:00"))
77
+        .toBe('09:00');
78
+    expect(PlanningEventManager.getFormattedEventTime("2020-03-21 09:00:00", "2020-03-22 17:00:00"))
79
+        .toBe('09:00 - 00:00');
80
+    expect(PlanningEventManager.getFormattedEventTime("2020-03-30 20:30:00", "2020-03-30 23:00:00"))
81
+        .toBe('20:30 - 23:00');
82
+});
19 83
 

Loading…
Cancel
Save