Browse Source

Added more tests and removed useless functions

Arnaud Vergnet 4 years ago
parent
commit
3a301bcbef

+ 5
- 2
screens/Planning/PlanningDisplayScreen.js View File

2
 
2
 
3
 import * as React from 'react';
3
 import * as React from 'react';
4
 import {Image, ScrollView, View} from 'react-native';
4
 import {Image, ScrollView, View} from 'react-native';
5
-import ThemeManager from "../../utils/ThemeManager";
6
 import HTML from "react-native-render-html";
5
 import HTML from "react-native-render-html";
7
 import {Linking} from "expo";
6
 import {Linking} from "expo";
8
 import PlanningEventManager from '../../utils/PlanningEventManager';
7
 import PlanningEventManager from '../../utils/PlanningEventManager';
9
 import {Card, withTheme} from 'react-native-paper';
8
 import {Card, withTheme} from 'react-native-paper';
9
+import DateManager from "../../utils/DateManager";
10
 
10
 
11
 type Props = {
11
 type Props = {
12
     navigation: Object,
12
     navigation: Object,
37
             <ScrollView style={{paddingLeft: 5, paddingRight: 5}}>
37
             <ScrollView style={{paddingLeft: 5, paddingRight: 5}}>
38
                 <Card.Title
38
                 <Card.Title
39
                     title={this.displayData.title}
39
                     title={this.displayData.title}
40
-                    subtitle={PlanningEventManager.getFormattedTime(this.displayData) + ' | ' + PlanningEventManager.getEventStartDate(this.displayData)}
40
+                    subtitle={
41
+                        PlanningEventManager.getFormattedEventTime(this.displayData["date_begin"], this.displayData["date_end"])
42
+                        + ' | '
43
+                        + DateManager.getInstance().getTranslatedDate(PlanningEventManager.getDateOnlyString(this.displayData["date_begin"]))}
41
                 />
44
                 />
42
                 {this.displayData.logo !== null ?
45
                 {this.displayData.logo !== null ?
43
                     <View style={{width: '100%', height: 300}}>
46
                     <View style={{width: '100%', height: 300}}>

+ 9
- 9
screens/Planning/PlanningScreen.js View File

37
  */
37
  */
38
 export default class PlanningScreen extends React.Component<Props, State> {
38
 export default class PlanningScreen extends React.Component<Props, State> {
39
 
39
 
40
-    agendaRef: Agenda;
40
+    agendaRef: Object;
41
     webDataManager: WebDataManager;
41
     webDataManager: WebDataManager;
42
 
42
 
43
     lastRefresh: Date;
43
     lastRefresh: Date;
122
     generateEmptyCalendar() {
122
     generateEmptyCalendar() {
123
         let end = new Date(new Date().setMonth(new Date().getMonth() + AGENDA_MONTH_SPAN + 1));
123
         let end = new Date(new Date().setMonth(new Date().getMonth() + AGENDA_MONTH_SPAN + 1));
124
         let daysOfYear = {};
124
         let daysOfYear = {};
125
-        for (let d = new Date(2019, 8, 1); d <= end; d.setDate(d.getDate() + 1)) {
125
+        for (let d = new Date(); d <= end; d.setDate(d.getDate() + 1)) {
126
             daysOfYear[this.getFormattedDate(new Date(d))] = []
126
             daysOfYear[this.getFormattedDate(new Date(d))] = []
127
         }
127
         }
128
         return daysOfYear;
128
         return daysOfYear;
136
                     <Divider/>
136
                     <Divider/>
137
                     <List.Item
137
                     <List.Item
138
                         title={item.title}
138
                         title={item.title}
139
-                        description={PlanningEventManager.getFormattedTime(item)}
140
-                        left={props => <Avatar.Image
139
+                        description={PlanningEventManager.getFormattedEventTime(item["date_begin"], item["date_end"])}
140
+                        left={() => <Avatar.Image
141
                             source={{uri: item.logo}}
141
                             source={{uri: item.logo}}
142
                             style={{backgroundColor: 'transparent'}}
142
                             style={{backgroundColor: 'transparent'}}
143
                         />}
143
                         />}
151
                     <Divider/>
151
                     <Divider/>
152
                     <List.Item
152
                     <List.Item
153
                         title={item.title}
153
                         title={item.title}
154
-                        description={PlanningEventManager.getFormattedTime(item)}
154
+                        description={PlanningEventManager.getFormattedEventTime(item["date_begin"], item["date_end"])}
155
                         onPress={onPress}
155
                         onPress={onPress}
156
                     />
156
                     />
157
                 </View>
157
                 </View>
205
     generateEventAgenda(eventList: Array<Object>) {
205
     generateEventAgenda(eventList: Array<Object>) {
206
         let agendaItems = this.generateEmptyCalendar();
206
         let agendaItems = this.generateEmptyCalendar();
207
         for (let i = 0; i < eventList.length; i++) {
207
         for (let i = 0; i < eventList.length; i++) {
208
-            if (agendaItems[PlanningEventManager.getEventStartDate(eventList[i])] !== undefined) {
209
-                this.pushEventInOrder(agendaItems, eventList[i], PlanningEventManager.getEventStartDate(eventList[i]));
208
+            if (PlanningEventManager.getDateOnlyString(eventList[i]["date_begin"]) !== undefined) {
209
+                this.pushEventInOrder(agendaItems, eventList[i], PlanningEventManager.getDateOnlyString(eventList[i]["date_begin"]));
210
             }
210
             }
211
         }
211
         }
212
         this.setState({agendaItems: agendaItems})
212
         this.setState({agendaItems: agendaItems})
217
             agendaItems[startDate].push(event);
217
             agendaItems[startDate].push(event);
218
         else {
218
         else {
219
             for (let i = 0; i < agendaItems[startDate].length; i++) {
219
             for (let i = 0; i < agendaItems[startDate].length; i++) {
220
-                if (PlanningEventManager.isEventBefore(event, agendaItems[startDate][i])) {
220
+                if (PlanningEventManager.isEventBefore(event["date_begin"], agendaItems[startDate][i]["date_begin"])) {
221
                     agendaItems[startDate].splice(i, 0, event);
221
                     agendaItems[startDate].splice(i, 0, event);
222
                     break;
222
                     break;
223
                 } else if (i === agendaItems[startDate].length - 1) {
223
                 } else if (i === agendaItems[startDate].length - 1) {
228
         }
228
         }
229
     }
229
     }
230
 
230
 
231
-    onAgendaRef(ref: Agenda) {
231
+    onAgendaRef(ref: Object) {
232
         this.agendaRef = ref;
232
         this.agendaRef = ref;
233
     }
233
     }
234
 
234
 

+ 2
- 33
screens/SelfMenuScreen.js View File

2
 
2
 
3
 import * as React from 'react';
3
 import * as React from 'react';
4
 import {View} from 'react-native';
4
 import {View} from 'react-native';
5
-import i18n from "i18n-js";
5
+import DateManager from "../utils/DateManager";
6
 import WebSectionList from "../components/WebSectionList";
6
 import WebSectionList from "../components/WebSectionList";
7
 import {Card, Text, withTheme} from 'react-native-paper';
7
 import {Card, Text, withTheme} from 'react-native-paper';
8
 import AprilFoolsManager from "../utils/AprilFoolsManager";
8
 import AprilFoolsManager from "../utils/AprilFoolsManager";
19
  */
19
  */
20
 class SelfMenuScreen extends React.Component<Props> {
20
 class SelfMenuScreen extends React.Component<Props> {
21
 
21
 
22
-    // Hard code strings as toLocaleDateString does not work on current android JS engine
23
-    daysOfWeek = [];
24
-    monthsOfYear = [];
25
-
26
     getRenderItem: Function;
22
     getRenderItem: Function;
27
     getRenderSectionHeader: Function;
23
     getRenderSectionHeader: Function;
28
     createDataset: Function;
24
     createDataset: Function;
30
 
26
 
31
     constructor(props) {
27
     constructor(props) {
32
         super(props);
28
         super(props);
33
-        this.daysOfWeek.push(i18n.t("date.daysOfWeek.monday"));
34
-        this.daysOfWeek.push(i18n.t("date.daysOfWeek.tuesday"));
35
-        this.daysOfWeek.push(i18n.t("date.daysOfWeek.wednesday"));
36
-        this.daysOfWeek.push(i18n.t("date.daysOfWeek.thursday"));
37
-        this.daysOfWeek.push(i18n.t("date.daysOfWeek.friday"));
38
-        this.daysOfWeek.push(i18n.t("date.daysOfWeek.saturday"));
39
-        this.daysOfWeek.push(i18n.t("date.daysOfWeek.sunday"));
40
-
41
-        this.monthsOfYear.push(i18n.t("date.monthsOfYear.january"));
42
-        this.monthsOfYear.push(i18n.t("date.monthsOfYear.february"));
43
-        this.monthsOfYear.push(i18n.t("date.monthsOfYear.march"));
44
-        this.monthsOfYear.push(i18n.t("date.monthsOfYear.april"));
45
-        this.monthsOfYear.push(i18n.t("date.monthsOfYear.may"));
46
-        this.monthsOfYear.push(i18n.t("date.monthsOfYear.june"));
47
-        this.monthsOfYear.push(i18n.t("date.monthsOfYear.july"));
48
-        this.monthsOfYear.push(i18n.t("date.monthsOfYear.august"));
49
-        this.monthsOfYear.push(i18n.t("date.monthsOfYear.september"));
50
-        this.monthsOfYear.push(i18n.t("date.monthsOfYear.october"));
51
-        this.monthsOfYear.push(i18n.t("date.monthsOfYear.november"));
52
-        this.monthsOfYear.push(i18n.t("date.monthsOfYear.december"));
53
 
29
 
54
         this.getRenderItem = this.getRenderItem.bind(this);
30
         this.getRenderItem = this.getRenderItem.bind(this);
55
         this.getRenderSectionHeader = this.getRenderSectionHeader.bind(this);
31
         this.getRenderSectionHeader = this.getRenderSectionHeader.bind(this);
80
         for (let i = 0; i < fetchedData.length; i++) {
56
         for (let i = 0; i < fetchedData.length; i++) {
81
             result.push(
57
             result.push(
82
                 {
58
                 {
83
-                    title: this.getFormattedDate(fetchedData[i].date),
59
+                    title: DateManager.getInstance().getTranslatedDate(fetchedData[i].date),
84
                     data: fetchedData[i].meal[0].foodcategory,
60
                     data: fetchedData[i].meal[0].foodcategory,
85
                     extraData: super.state,
61
                     extraData: super.state,
86
                     keyExtractor: this.getKeyExtractor,
62
                     keyExtractor: this.getKeyExtractor,
90
         return result
66
         return result
91
     }
67
     }
92
 
68
 
93
-    getFormattedDate(dateString: string) {
94
-        let dateArray = dateString.split('-');
95
-        let date = new Date();
96
-        date.setFullYear(parseInt(dateArray[0]), parseInt(dateArray[1]) - 1, parseInt(dateArray[2]));
97
-        return this.daysOfWeek[date.getDay() - 1] + " " + date.getDate() + " " + this.monthsOfYear[date.getMonth()] + " " + date.getFullYear();
98
-    }
99
-
100
     getRenderSectionHeader({section}: Object) {
69
     getRenderSectionHeader({section}: Object) {
101
         return (
70
         return (
102
             <Card style={{
71
             <Card style={{

+ 50
- 0
utils/DateManager.js View File

1
+import i18n from 'i18n-js';
2
+
3
+export default class DateManager {
4
+    static instance: DateManager | null = null;
5
+
6
+    // Hard code strings as toLocaleDateString does not work on current android JS engine
7
+    daysOfWeek = [];
8
+    monthsOfYear = [];
9
+
10
+    constructor() {
11
+        this.daysOfWeek.push(i18n.t("date.daysOfWeek.monday"));
12
+        this.daysOfWeek.push(i18n.t("date.daysOfWeek.tuesday"));
13
+        this.daysOfWeek.push(i18n.t("date.daysOfWeek.wednesday"));
14
+        this.daysOfWeek.push(i18n.t("date.daysOfWeek.thursday"));
15
+        this.daysOfWeek.push(i18n.t("date.daysOfWeek.friday"));
16
+        this.daysOfWeek.push(i18n.t("date.daysOfWeek.saturday"));
17
+        this.daysOfWeek.push(i18n.t("date.daysOfWeek.sunday"));
18
+
19
+        this.monthsOfYear.push(i18n.t("date.monthsOfYear.january"));
20
+        this.monthsOfYear.push(i18n.t("date.monthsOfYear.february"));
21
+        this.monthsOfYear.push(i18n.t("date.monthsOfYear.march"));
22
+        this.monthsOfYear.push(i18n.t("date.monthsOfYear.april"));
23
+        this.monthsOfYear.push(i18n.t("date.monthsOfYear.may"));
24
+        this.monthsOfYear.push(i18n.t("date.monthsOfYear.june"));
25
+        this.monthsOfYear.push(i18n.t("date.monthsOfYear.july"));
26
+        this.monthsOfYear.push(i18n.t("date.monthsOfYear.august"));
27
+        this.monthsOfYear.push(i18n.t("date.monthsOfYear.september"));
28
+        this.monthsOfYear.push(i18n.t("date.monthsOfYear.october"));
29
+        this.monthsOfYear.push(i18n.t("date.monthsOfYear.november"));
30
+        this.monthsOfYear.push(i18n.t("date.monthsOfYear.december"));
31
+    }
32
+
33
+    /**
34
+     * Get this class instance or create one if none is found
35
+     * @returns {DateManager}
36
+     */
37
+    static getInstance(): DateManager {
38
+        return DateManager.instance === null ?
39
+            DateManager.instance = new DateManager() :
40
+            DateManager.instance;
41
+    }
42
+
43
+    getTranslatedDate(dateString: string) {
44
+        let dateArray = dateString.split('-');
45
+        let date = new Date();
46
+        date.setFullYear(parseInt(dateArray[0]), parseInt(dateArray[1]) - 1, parseInt(dateArray[2]));
47
+        return this.daysOfWeek[date.getDay() - 1] + " " + date.getDate() + " " + this.monthsOfYear[date.getMonth()] + " " + date.getFullYear();
48
+    }
49
+
50
+}

+ 25
- 35
utils/PlanningEventManager.js View File

3
     // Regex used to check date string validity
3
     // Regex used to check date string validity
4
     static dateRegExp = /^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/;
4
     static dateRegExp = /^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/;
5
 
5
 
6
-    static isEventBefore(event1: Object, event2: Object) {
7
-        let date1 = new Date();
8
-        let date2 = new Date();
9
-        let timeArray = PlanningEventManager.getEventStartTime(event1).split(":");
10
-        date1.setHours(parseInt(timeArray[0]), parseInt(timeArray[1]));
11
-        timeArray = PlanningEventManager.getEventStartTime(event2).split(":");
12
-        date2.setHours(parseInt(timeArray[0]), parseInt(timeArray[1]));
13
-        return date1 < date2;
14
-    }
15
-
16
-    static getEventStartDate(event: Object) {
17
-        return event.date_begin.split(" ")[0];
18
-    }
19
-
20
-    static getEventStartTime(event: Object) {
21
-        if (event !== undefined && Object.keys(event).length > 0 && event.date_begin !== null)
22
-            return PlanningEventManager.formatTime(event.date_begin.split(" ")[1]);
23
-        else
24
-            return "";
25
-    }
26
-
27
-    static getEventEndTime(event: Object) {
28
-        if (event !== undefined && Object.keys(event).length > 0 && event.date_end !== null)
29
-            return PlanningEventManager.formatTime(event.date_end.split(" ")[1]);
6
+    /**
7
+     * Checks if the given date is before the other.
8
+     *
9
+     * @param event1Date Event 1 date in format YYYY-MM-DD HH:MM:SS
10
+     * @param event2Date Event 2 date in format YYYY-MM-DD HH:MM:SS
11
+     * @return {boolean}
12
+     */
13
+    static isEventBefore(event1Date: ?string, event2Date: ?string) {
14
+        let date1 = PlanningEventManager.stringToDate(event1Date);
15
+        let date2 = PlanningEventManager.stringToDate(event2Date);
16
+        if (date1 !== undefined && date2 !== undefined)
17
+            return date1 < date2;
30
         else
18
         else
31
-            return "";
19
+            return false;
32
     }
20
     }
33
 
21
 
34
-    static getFormattedTime(event: Object) {
35
-        if (PlanningEventManager.getEventEndTime(event) !== "")
36
-            return PlanningEventManager.getEventStartTime(event) + " - " + PlanningEventManager.getEventEndTime(event);
22
+    /**
23
+     * Gets only the date part of the given event date string in the format
24
+     * YYYY-MM-DD HH:MM:SS
25
+     *
26
+     * @param dateString The string to get the date from
27
+     * @return {string|undefined} Date in format YYYY:MM:DD or undefined if given string is invalid
28
+     */
29
+    static getDateOnlyString(dateString: ?string) {
30
+        if (PlanningEventManager.isDateStringFormatValid(dateString))
31
+            return dateString.split(" ")[0];
37
         else
32
         else
38
-            return PlanningEventManager.getEventStartTime(event);
39
-    }
40
-
41
-    static formatTime(time: string) {
42
-        let array = time.split(':');
43
-        return array[0] + ':' + array[1];
33
+            return undefined;
44
     }
34
     }
45
 
35
 
46
     /**
36
     /**
61
      * Accepted format: YYYY-MM-DD HH:MM:SS
51
      * Accepted format: YYYY-MM-DD HH:MM:SS
62
      *
52
      *
63
      * @param dateString The string to convert
53
      * @param dateString The string to convert
64
-     * @return {Date} The date object or undefined if the given string is invalid
54
+     * @return {Date|undefined} The date object or undefined if the given string is invalid
65
      */
55
      */
66
     static stringToDate(dateString: ?string): Date | undefined {
56
     static stringToDate(dateString: ?string): Date | undefined {
67
         let date = new Date();
57
         let date = new Date();

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

4
 test('isDescriptionEmpty', () => {
4
 test('isDescriptionEmpty', () => {
5
     expect(PlanningEventManager.isDescriptionEmpty("")).toBeTrue();
5
     expect(PlanningEventManager.isDescriptionEmpty("")).toBeTrue();
6
     expect(PlanningEventManager.isDescriptionEmpty("   ")).toBeTrue();
6
     expect(PlanningEventManager.isDescriptionEmpty("   ")).toBeTrue();
7
+    // noinspection CheckTagEmptyBody
7
     expect(PlanningEventManager.isDescriptionEmpty("<p></p>")).toBeTrue();
8
     expect(PlanningEventManager.isDescriptionEmpty("<p></p>")).toBeTrue();
8
     expect(PlanningEventManager.isDescriptionEmpty("<p>   </p>")).toBeTrue();
9
     expect(PlanningEventManager.isDescriptionEmpty("<p>   </p>")).toBeTrue();
9
     expect(PlanningEventManager.isDescriptionEmpty("<p><br></p>")).toBeTrue();
10
     expect(PlanningEventManager.isDescriptionEmpty("<p><br></p>")).toBeTrue();
81
         .toBe('20:30 - 23:00');
82
         .toBe('20:30 - 23:00');
82
 });
83
 });
83
 
84
 
85
+test('getDateOnlyString', () => {
86
+    expect(PlanningEventManager.getDateOnlyString("2020-03-21 09:00:00")).toBe("2020-03-21");
87
+    expect(PlanningEventManager.getDateOnlyString("2021-12-15 09:00:00")).toBe("2021-12-15");
88
+    expect(PlanningEventManager.getDateOnlyString("2021-12-o5 09:00:00")).toBeUndefined();
89
+    expect(PlanningEventManager.getDateOnlyString("2021-12-15 09:")).toBeUndefined();
90
+    expect(PlanningEventManager.getDateOnlyString("2021-12-15")).toBeUndefined();
91
+    expect(PlanningEventManager.getDateOnlyString("garbage")).toBeUndefined();
92
+});
93
+
94
+test('isEventBefore', () => {
95
+    expect(PlanningEventManager.isEventBefore(
96
+        "2020-03-21 09:00:00", "2020-03-21 10:00:00")).toBeTrue();
97
+    expect(PlanningEventManager.isEventBefore(
98
+        "2020-03-21 10:00:00", "2020-03-21 10:15:00")).toBeTrue();
99
+    expect(PlanningEventManager.isEventBefore(
100
+        "2020-03-21 10:15:05", "2020-03-21 10:15:54")).toBeTrue();
101
+    expect(PlanningEventManager.isEventBefore(
102
+        "2020-03-21 10:15:05", "2021-03-21 10:15:05")).toBeTrue();
103
+    expect(PlanningEventManager.isEventBefore(
104
+        "2020-03-21 10:15:05", "2020-05-21 10:15:05")).toBeTrue();
105
+    expect(PlanningEventManager.isEventBefore(
106
+        "2020-03-21 10:15:05", "2020-03-30 10:15:05")).toBeTrue();
107
+
108
+    expect(PlanningEventManager.isEventBefore(
109
+        "2020-03-21 10:00:00", "2020-03-21 09:00:00")).toBeFalse();
110
+    expect(PlanningEventManager.isEventBefore(
111
+        "2020-03-21 10:15:00", "2020-03-21 10:00:00")).toBeFalse();
112
+    expect(PlanningEventManager.isEventBefore(
113
+        "2020-03-21 10:15:54", "2020-03-21 10:15:05")).toBeFalse();
114
+    expect(PlanningEventManager.isEventBefore(
115
+        "2021-03-21 10:15:05", "2020-03-21 10:15:05")).toBeFalse();
116
+    expect(PlanningEventManager.isEventBefore(
117
+        "2020-05-21 10:15:05", "2020-03-21 10:15:05")).toBeFalse();
118
+    expect(PlanningEventManager.isEventBefore(
119
+        "2020-03-30 10:15:05", "2020-03-21 10:15:05")).toBeFalse();
120
+
121
+    expect(PlanningEventManager.isEventBefore(
122
+        "garbage", "2020-03-21 10:15:05")).toBeFalse();
123
+    expect(PlanningEventManager.isEventBefore(
124
+        undefined, undefined)).toBeFalse();
125
+});
126
+

Loading…
Cancel
Save