schedule_spec.js 10.8 KB
Newer Older
1
define(['edx-ui-toolkit/js/utils/spec-helpers/ajax-helpers', 'js/ccx/schedule'],
2
    function(AjaxHelpers) {
3
        describe('edx.ccx.schedule.ScheduleView', function() {
4
            var view = null;
5
            var data;
6 7

            beforeEach(function() {
8
                loadFixtures('js/fixtures/ccx/schedule.html');
9

10
                var scheduleFixture = readFixtures('templates/ccx/schedule.underscore');
11
                appendSetFixtures(
12
                    '<script id="schedule_template" type="text/template" >' + scheduleFixture + '</script>'
13
                );
14 15 16 17 18
                schedule_template = _.template($('#schedule_template').html());
                save_url = 'save_ccx';

                $.fn.leanModal = function(param) {
                    return true;
19
                };
20 21

                data = [{
22 23 24 25 26 27 28
                    'category': 'chapter',
                    'display_name': 'Introduction',
                    'due': null,
                    'start': null,
                    'location': 'i4x://edX/DemoX/chapter/d8a6192ade314473a78242dfeedfbf5b',
                    'hidden': true,
                    'children': [
29
                        {
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
                            'category': 'sequential',
                            'display_name': 'Demo Course Overview',
                            'due': null,
                            'start': null,
                            'location': 'i4x://edX/DemoX/sequential/edx_introduction',
                            'hidden': true,
                            'children': [
                                {
                                    'category': 'vertical',
                                    'display_name': 'Introduction: Video and Sequences',
                                    'due': null,
                                    'start': null,
                                    'location': 'i4x://edX/DemoX/vertical/vertical_0270f6de40fc',
                                    'hidden': true
                                }
                            ]
46 47 48 49
                        }
                    ]
                }];
                view = new edx.ccx.schedule.ScheduleView({el: $('#new-ccx-schedule')});
50
                view.schedule_collection.set(data);
51 52 53
                view.render();
            });

54
            it('verifies correct view setup', function() {
55 56 57 58 59 60
                expect(view.dirty).toBe(false);
                expect(view.showing).toEqual([]);
                expect(view.hidden).toEqual(data);
                expect(view.schedule).toEqual(data);
            });

61
            it('finds a unit', function() {
62 63 64 65
                var unit = view.find_unit(view.schedule, 'i4x://edX/DemoX/chapter/d8a6192ade314473a78242dfeedfbf5b');
                expect(unit).toEqual(data[0]);
            });

66
            it('hides a unit', function() {
67 68 69 70 71 72
                var unit = view.find_unit(view.schedule, 'i4x://edX/DemoX/chapter/d8a6192ade314473a78242dfeedfbf5b');
                unit.hidden = false;
                view.hide(unit);
                expect(unit.hidden).toBe(true);
            });

73
            it('shows a unit', function() {
74 75 76 77 78
                var unit = view.find_unit(view.schedule, 'i4x://edX/DemoX/chapter/d8a6192ade314473a78242dfeedfbf5b');
                view.show(unit);
                expect(unit.hidden).toBe(false);
            });

79
            it('applies function to schedule nodes', function() {
80 81
                var unit = view.find_unit(view.schedule, 'i4x://edX/DemoX/chapter/d8a6192ade314473a78242dfeedfbf5b');
                expect(unit.hidden).toBe(true);
82
                view.schedule_apply(view.schedule, view.show);
83 84 85
                expect(unit.hidden).toBe(false);
            });

86
            it('adds all units to schedule', function() {
87 88 89 90 91 92 93
                expect(view.showing).toEqual([]);
                expect(view.hidden.length).toEqual(1);
                $('#add-all').click();
                expect(view.showing.length).toEqual(1);
                expect(view.hidden).toEqual([]);
            });

94
            it('selects a chapter and adds units to dropdown', function() {
95 96 97 98 99 100 101 102 103 104 105
                expect(view.sequential_select.children('option').length).toEqual(0);
                view.chapter_select.change();
                expect(view.sequential_select.prop('disabled')).toEqual(true);
                var val = 'i4x://edX/DemoX/chapter/d8a6192ade314473a78242dfeedfbf5b';
                view.chapter_select.val(val);
                view.chapter_select.change();
                expect(view.chapter_select.val()).toEqual(val);
                expect(view.sequential_select.prop('disabled')).toEqual(false);
                expect(view.sequential_select.children('option').length).toEqual(2);
            });

106
            it('selects a unit and adds sections to dropdown', function() {
107 108 109 110 111 112
                var val = 'i4x://edX/DemoX/chapter/d8a6192ade314473a78242dfeedfbf5b';
                view.chapter_select.val(val);
                view.chapter_select.change();
                expect(view.vertical_select.children('option').length).toEqual(0);
                view.sequential_select.change();
                expect(view.vertical_select.prop('disabled')).toEqual(true);
113
                val = 'i4x://edX/DemoX/sequential/edx_introduction';
114 115 116 117 118 119 120
                view.sequential_select.val(val);
                view.sequential_select.change();
                expect(view.sequential_select.val()).toEqual(val);
                expect(view.vertical_select.prop('disabled')).toEqual(false);
                expect(view.vertical_select.children('option').length).toEqual(2);
            });

121
            it('selects a section', function() {
122 123 124
                var val = 'i4x://edX/DemoX/chapter/d8a6192ade314473a78242dfeedfbf5b';
                view.chapter_select.val(val);
                view.chapter_select.change();
125
                val = 'i4x://edX/DemoX/sequential/edx_introduction';
126 127
                view.sequential_select.val(val);
                view.sequential_select.change();
128
                val = 'i4x://edX/DemoX/vertical/vertical_0270f6de40fc';
129 130 131 132 133
                view.vertical_select.val(val);
                view.vertical_select.change();
                expect(view.vertical_select.val()).toEqual(val);
            });

134
            it('adds a unit', function() {
135 136 137
                var val = 'i4x://edX/DemoX/chapter/d8a6192ade314473a78242dfeedfbf5b';
                view.chapter_select.val(val);
                view.chapter_select.change();
138
                val = 'i4x://edX/DemoX/sequential/edx_introduction';
139 140
                view.sequential_select.val(val);
                view.sequential_select.change();
141
                val = 'i4x://edX/DemoX/vertical/vertical_0270f6de40fc',
142 143 144
                view.vertical_select.val(val);
                view.vertical_select.change();
                var unit = view.find_unit(view.schedule, 'i4x://edX/DemoX/chapter/d8a6192ade314473a78242dfeedfbf5b');
145 146
                view.set_datetime('start', '2015-12-12 10:00');
                view.set_datetime('due', '2015-12-12 10:30');
147 148 149 150 151
                expect(unit.hidden).toBe(true);
                $('#add-unit-button').click();
                expect(unit.hidden).toBe(false);
            });

152
            it('add unit when start date is greater the due date', function() {
153 154 155
                var val = 'i4x://edX/DemoX/chapter/d8a6192ade314473a78242dfeedfbf5b';
                view.chapter_select.val(val);
                view.chapter_select.change();
156
                val = 'i4x://edX/DemoX/sequential/edx_introduction';
157 158
                view.sequential_select.val(val);
                view.sequential_select.change();
159
                val = 'i4x://edX/DemoX/vertical/vertical_0270f6de40fc';
160 161 162 163 164 165 166 167 168 169 170 171
                view.vertical_select.val(val);
                view.vertical_select.change();
                var unit = view.find_unit(view.schedule, 'i4x://edX/DemoX/chapter/d8a6192ade314473a78242dfeedfbf5b');
                // start date is before due date
                view.set_datetime('start', '2015-11-13 10:45');
                view.set_datetime('due', '2015-11-12 10:00');
                expect(unit.hidden).toBe(true);
                $('#add-unit-button').click();
                // Assert unit is not added to schedule
                expect(unit.hidden).toBe(true);
            });

172
            it('add unit when start date is missing', function() {
173 174 175
                var val = 'i4x://edX/DemoX/chapter/d8a6192ade314473a78242dfeedfbf5b';
                view.chapter_select.val(val);
                view.chapter_select.change();
176
                val = 'i4x://edX/DemoX/sequential/edx_introduction';
177 178
                view.sequential_select.val(val);
                view.sequential_select.change();
179
                val = 'i4x://edX/DemoX/vertical/vertical_0270f6de40fc';
180 181 182 183 184 185 186 187 188 189 190 191
                view.vertical_select.val(val);
                view.vertical_select.change();
                var unit = view.find_unit(view.schedule, 'i4x://edX/DemoX/chapter/d8a6192ade314473a78242dfeedfbf5b');
                // start date is missing
                view.set_datetime('start', null);
                view.set_datetime('due', '2015-12-12 10:00');
                expect(unit.hidden).toBe(true);
                $('#add-unit-button').click();
                // Assert unit is not added to schedule
                expect(unit.hidden).toBe(true);
            });

192
            it('gets a datetime string from date and time fields', function() {
193 194 195 196 197
                view.set_datetime('start', '2015-12-12 10:45');
                expect($('form#add-unit input[name=start_date]')).toHaveValue('2015-12-12');
                expect($('form#add-unit input[name=start_time]')).toHaveValue('10:45');
            });

198
            it('sets date and time fields from datetime string', function() {
199 200 201 202 203 204
                $('form#add-unit input[name=start_date]').val('2015-12-12');
                $('form#add-unit input[name=start_time]').val('10:45');
                var datetime = view.get_datetime('start');
                expect(datetime).toBe('2015-12-12 10:45');
            });

205 206
            it('saves schedule changes', function() {
                requests = AjaxHelpers['requests'](this);
207
                view.save();
208
                expect(requests.length).toEqual(1);
209
                AjaxHelpers.expectJsonRequest(requests, 'POST', 'save_ccx', view.schedule);
210
                expect($('#dirty-schedule #save-changes').text()).toEqual('Saving');
211 212 213
                AjaxHelpers.respondWithJson(requests, {
                    data: view.schedule
                });
214
                expect($('#dirty-schedule #save-changes').text()).toEqual('Save changes');
215 216 217
                expect($('#ajax-error')).toHaveCss({display: 'none'});
            });

218 219
            it('displays an error if the sync fails', function() {
                requests = AjaxHelpers['requests'](this);
220 221 222 223 224 225 226
                view.save();
                requests[0].respond(500);
                expect($('#ajax-error')).toHaveCss({display: 'block'});
            });
        });
    }
);