|
| 1 | +import angular from 'angular' |
| 2 | + |
1 | 3 | /* jshint -W117, -W030 */
|
2 | 4 | describe('Topcoder File Input Directive', function() {
|
3 |
| - var scope, element, isolateScope, fileInput; |
| 5 | + var scope, element, isolateScope, fileInput |
4 | 6 |
|
5 | 7 | beforeEach(function() {
|
6 |
| - bard.appModule('topcoder'); |
7 |
| - bard.inject(this, '$compile', '$rootScope'); |
8 |
| - scope = $rootScope.$new(); |
| 8 | + bard.appModule('topcoder') |
| 9 | + bard.inject(this, '$compile', '$rootScope', '$timeout') |
| 10 | + scope = $rootScope.$new() |
9 | 11 |
|
10 | 12 | var html = '' +
|
11 | 13 | '<form>' +
|
12 | 14 | '<tc-file-input ' +
|
13 |
| - 'label-text="Preview Image"' + |
14 |
| - 'field-id="DESIGN_COVER"' + |
| 15 | + 'label-text="Submission"' + |
| 16 | + 'field-id="SUBMISSION_ZIP"' + |
15 | 17 | 'button-text="Add File"' +
|
16 |
| - 'file-type="jpg,jpeg,png"' + |
17 |
| - 'placeholder="Image file as .jpg or .png"' + |
| 18 | + 'file-type="zip"' + |
| 19 | + 'placeholder="Attach all visible files as a single .zip file"' + |
18 | 20 | 'mandatory="true"' +
|
19 | 21 | 'set-file-reference="vm.setFileReference(file, fieldId)"' +
|
20 | 22 | 'ng-model="vm.submissionForm.submissionZip"' +
|
21 | 23 | ' />' +
|
22 |
| - '</form>'; |
23 |
| - var form = angular.element(html); |
24 |
| - element = form.find('tc-file-input'); |
25 |
| - var formElement = $compile(form)(scope); |
26 |
| - scope.$digest(); |
| 24 | + '</form>' |
| 25 | + var form = angular.element(html) |
| 26 | + element = form.find('tc-file-input') |
| 27 | + var formElement = $compile(form)(scope) |
| 28 | + scope.$digest() |
27 | 29 |
|
28 |
| - isolateScope = element.isolateScope(); |
29 |
| - }); |
| 30 | + isolateScope = element.isolateScope() |
| 31 | + }) |
30 | 32 |
|
31 | 33 | beforeEach(function() {
|
32 |
| - fileInput = $(element).find('.none')[0]; |
33 |
| - }); |
| 34 | + fileInput = $(element).find('.none')[0] |
| 35 | + }) |
34 | 36 |
|
35 | 37 | afterEach(function() {
|
36 |
| - scope.$destroy(); |
37 |
| - fileInput = undefined; |
38 |
| - }); |
| 38 | + scope.$destroy() |
| 39 | + fileInput = undefined |
| 40 | + }) |
39 | 41 |
|
40 |
| - bard.verifyNoOutstandingHttpRequests(); |
| 42 | + bard.verifyNoOutstandingHttpRequests() |
41 | 43 |
|
42 | 44 | describe('selectFile', function() {
|
43 | 45 | it('triggers a click on the file input', function() {
|
44 |
| - var mockClick = sinon.spy(fileInput, 'click'); |
| 46 | + var mockClick = sinon.spy(fileInput, 'click') |
45 | 47 |
|
46 |
| - isolateScope.selectFile(); |
47 |
| - scope.$digest(); |
| 48 | + isolateScope.selectFile() |
| 49 | + scope.$digest() |
48 | 50 |
|
49 |
| - expect(mockClick).calledOnce; |
50 |
| - }); |
51 |
| - }); |
| 51 | + expect(mockClick).calledOnce |
| 52 | + }) |
| 53 | + }) |
52 | 54 |
|
53 | 55 | describe('a change event on the file input', function() {
|
54 |
| - var fileNameInput, fileList, mockSetFileReference; |
| 56 | + var fileNameInput, fileList, mockSetFileReference |
55 | 57 |
|
56 | 58 | beforeEach(function() {
|
57 |
| - fileNameInput = $(element).find('input[type=text]')[0]; |
| 59 | + fileNameInput = $(element).find('input[type=text]')[0] |
58 | 60 | fileList = {
|
59 | 61 | 0: {
|
60 |
| - name: 'test.png', |
| 62 | + name: 'test.zip', |
61 | 63 | size: 50,
|
62 |
| - type: 'image/png' |
| 64 | + type: 'application/zip' |
63 | 65 | },
|
64 | 66 | length: 1,
|
65 |
| - item: function (index) { return file; } |
66 |
| - }; |
| 67 | + item: function (index) { return file } |
| 68 | + } |
67 | 69 |
|
68 |
| - mockSetFileReference = sinon.spy(isolateScope, 'setFileReference'); |
69 |
| - }); |
| 70 | + mockSetFileReference = sinon.spy(isolateScope, 'setFileReference') |
| 71 | + }) |
70 | 72 |
|
71 | 73 | afterEach(function() {
|
72 |
| - fileNameInput = undefined; |
73 |
| - fileList = undefined; |
74 |
| - mockSetFileReference = undefined; |
75 |
| - }); |
| 74 | + fileNameInput = undefined |
| 75 | + fileList = undefined |
| 76 | + mockSetFileReference = undefined |
| 77 | + }) |
76 | 78 |
|
77 | 79 | it('sets the value of the fileNameInput with the name of the file', function() {
|
78 | 80 | $(fileInput).triggerHandler({
|
79 | 81 | type: 'change',
|
80 | 82 | target: { files: fileList }
|
81 |
| - }); |
| 83 | + }) |
| 84 | + |
| 85 | + $timeout.flush() |
82 | 86 |
|
83 |
| - expect(fileNameInput.value).to.equal('test.png'); |
84 |
| - }); |
| 87 | + expect(fileNameInput.value).to.equal('test.zip') |
| 88 | + }) |
85 | 89 |
|
86 | 90 | describe('with a valid file', function() {
|
87 | 91 | beforeEach(function() {
|
88 | 92 | $(fileInput).triggerHandler({
|
89 | 93 | type: 'change',
|
90 | 94 | target: { files: fileList }
|
91 |
| - }); |
92 |
| - }); |
| 95 | + }) |
| 96 | + $timeout.flush() |
| 97 | + }) |
93 | 98 |
|
94 | 99 | it('calls setFileReference', function() {
|
95 |
| - expect(mockSetFileReference).calledOnce; |
96 |
| - }); |
| 100 | + expect(mockSetFileReference).calledOnce |
| 101 | + }) |
97 | 102 |
|
98 | 103 | it('has ng-valid-filesize class', function() {
|
99 |
| - expect($(fileInput).hasClass('ng-valid-filesize')).to.be.true; |
100 |
| - }); |
| 104 | + expect($(fileInput).hasClass('ng-valid-filesize')).to.be.true |
| 105 | + }) |
101 | 106 |
|
102 | 107 | it('has ng-valid-required class', function() {
|
103 |
| - expect($(fileInput).hasClass('ng-valid-required')).to.be.true; |
104 |
| - }); |
105 |
| - }); |
| 108 | + expect($(fileInput).hasClass('ng-valid-required')).to.be.true |
| 109 | + }) |
106 | 110 |
|
107 |
| - describe('with a file that\'s greater than 500MB', function() { |
108 |
| - beforeEach(function() { |
109 |
| - fileList[0].size = 500000001; |
| 111 | + it('works with Windows file type application/x-zip', function(){ |
| 112 | + fileList[0].type = 'application/x-zip' |
110 | 113 |
|
111 | 114 | $(fileInput).triggerHandler({
|
112 | 115 | type: 'change',
|
113 | 116 | target: { files: fileList }
|
114 |
| - }); |
115 |
| - }); |
| 117 | + }) |
116 | 118 |
|
117 |
| - it('does not call setFileReference', function() { |
118 |
| - expect(mockSetFileReference).not.calledOnce; |
119 |
| - }); |
| 119 | + $timeout.flush() |
120 | 120 |
|
121 |
| - it('has ng-touched and ng-invalid-filesize classes', function() { |
122 |
| - expect($(fileInput).hasClass('ng-invalid-filesize')).to.be.true; |
123 |
| - expect($(fileInput).hasClass('ng-touched')).to.be.true; |
124 |
| - }); |
125 |
| - }); |
| 121 | + expect(mockSetFileReference).called |
| 122 | + expect($(fileInput).hasClass('ng-valid-filesize')).to.be.true |
| 123 | + expect($(fileInput).hasClass('ng-valid-required')).to.be.true |
| 124 | + }) |
| 125 | + |
| 126 | + it('works with Windows file type application/x-zip-compressed', function(){ |
| 127 | + fileList[0].type = 'application/x-zip-compressed' |
| 128 | + |
| 129 | + $(fileInput).triggerHandler({ |
| 130 | + type: 'change', |
| 131 | + target: { files: fileList } |
| 132 | + }) |
| 133 | + |
| 134 | + $timeout.flush() |
| 135 | + |
| 136 | + expect(mockSetFileReference).called |
| 137 | + expect($(fileInput).hasClass('ng-valid-filesize')).to.be.true |
| 138 | + expect($(fileInput).hasClass('ng-valid-required')).to.be.true |
| 139 | + }) |
| 140 | + }) |
126 | 141 |
|
127 | 142 | describe('with a file type that\'s not in the list of fileTypes given to the directive', function() {
|
128 | 143 | beforeEach(function() {
|
129 |
| - fileList[0].type = 'application/zip'; |
| 144 | + fileList[0].type = 'image/png' |
130 | 145 |
|
131 | 146 | $(fileInput).triggerHandler({
|
132 | 147 | type: 'change',
|
133 | 148 | target: { files: fileList }
|
134 |
| - }); |
135 |
| - }); |
| 149 | + }) |
| 150 | + |
| 151 | + $timeout.flush() |
| 152 | + }) |
136 | 153 |
|
137 | 154 | it('does not call setFileReference', function() {
|
138 |
| - expect(mockSetFileReference).not.calledOnce; |
139 |
| - }); |
| 155 | + expect(mockSetFileReference).not.calledOnce |
| 156 | + }) |
140 | 157 |
|
141 | 158 | it('has ng-touched and ng-invalid-required classes', function() {
|
142 |
| - expect($(fileInput).hasClass('ng-invalid-required')).to.be.true; |
143 |
| - expect($(fileInput).hasClass('ng-touched')).to.be.true; |
144 |
| - }); |
145 |
| - }); |
| 159 | + expect($(fileInput).hasClass('ng-invalid-required')).to.be.true |
| 160 | + expect($(fileInput).hasClass('ng-touched')).to.be.true |
| 161 | + }) |
| 162 | + }) |
| 163 | + |
| 164 | + describe('with a file that\'s greater than 500MB', function() { |
| 165 | + beforeEach(function() { |
| 166 | + fileList[0].size = 500000001 |
| 167 | + |
| 168 | + $(fileInput).triggerHandler({ |
| 169 | + type: 'change', |
| 170 | + target: { files: fileList } |
| 171 | + }) |
| 172 | + |
| 173 | + $timeout.flush() |
| 174 | + }) |
146 | 175 |
|
147 |
| - }); |
148 |
| -}); |
| 176 | + it('does not call setFileReference', function() { |
| 177 | + expect(mockSetFileReference).not.calledOnce |
| 178 | + }) |
| 179 | + |
| 180 | + it('has ng-touched and ng-invalid-filesize classes', function() { |
| 181 | + expect($(fileInput).hasClass('ng-invalid-filesize')).to.be.true |
| 182 | + expect($(fileInput).hasClass('ng-touched')).to.be.true |
| 183 | + }) |
| 184 | + }) |
| 185 | + }) |
| 186 | +}) |
0 commit comments