From 4a5cac41b45d2b8e0a3fd5b015d6be1e67d781ac Mon Sep 17 00:00:00 2001 From: OJ Kwon Date: Thu, 5 Jan 2017 14:32:54 -0800 Subject: [PATCH] refactor(ajax tests): remove separate ajaxHelper module (#2225) * refactor(ajaxHelper): remove separate ajax helper -relates to #2045 * chore(wallaby): update wallaby configuration --- spec/helpers/ajax-helper.ts | 288 ------------------------- spec/observables/dom/ajax-spec.ts | 192 ++++++++++++++++- spec/observables/dom/webSocket-spec.ts | 103 +++++++-- spec/support/debug.opts | 1 - spec/support/default.opts | 1 - wallaby.js | 1 - 6 files changed, 280 insertions(+), 306 deletions(-) delete mode 100644 spec/helpers/ajax-helper.ts diff --git a/spec/helpers/ajax-helper.ts b/spec/helpers/ajax-helper.ts deleted file mode 100644 index 1f22acf82c..0000000000 --- a/spec/helpers/ajax-helper.ts +++ /dev/null @@ -1,288 +0,0 @@ -declare const __root__: any; - -export class MockWebSocket { - static sockets: Array = []; - static get lastSocket(): MockWebSocket { - const socket = MockWebSocket.sockets; - const length = socket.length; - return length > 0 ? socket[length - 1] : undefined; - } - - static clearSockets(): void { - MockWebSocket.sockets.length = 0; - } - - sent: Array = []; - handlers: any = {}; - readyState: number = 0; - closeCode: any; - closeReason: any; - - constructor(public url: string, public protocol: string) { - MockWebSocket.sockets.push(this); - } - - send(data: any): void { - this.sent.push(data); - } - - get lastMessageSent(): any { - const sent = this.sent; - const length = sent.length; - - return length > 0 ? sent[length - 1] : undefined; - } - - triggerClose(e: any): void { - this.readyState = 3; - this.trigger('close', e); - } - - triggerError(err: any): void { - this.readyState = 3; - this.trigger('error', err); - } - - triggerMessage(data: any): void { - const messageEvent = { - data: data, - origin: 'mockorigin', - ports: undefined, - source: __root__, - }; - - this.trigger('message', messageEvent); - } - - open(): void { - this.readyState = 1; - this.trigger('open', {}); - } - - close(code: any, reason: any): void { - if (this.readyState < 2) { - this.readyState = 2; - this.closeCode = code; - this.closeReason = reason; - this.triggerClose({ wasClean: true }); - } - } - - addEventListener(name: string, handler: any): void { - const lookup = this.handlers[name] = this.handlers[name] || []; - lookup.push(handler); - } - - removeEventListener(name: string, handler: any): void { - const lookup = this.handlers[name]; - if (lookup) { - for (let i = lookup.length - 1; i--; ) { - if (lookup[i] === handler) { - lookup.splice(i, 1); - } - } - } - } - - trigger(name: string, e: any) { - if (this['on' + name]) { - this['on' + name](e); - } - - const lookup = this.handlers[name]; - if (lookup) { - for (let i = 0; i < lookup.length; i++) { - lookup[i](e); - } - } - } -} - -export class MockXMLHttpRequest { - private static requests: Array = []; - private static recentRequest: MockXMLHttpRequest; - - static get mostRecent(): MockXMLHttpRequest { - return MockXMLHttpRequest.recentRequest; - } - - static get allRequests(): Array { - return MockXMLHttpRequest.requests; - } - - static clearRequest(): void { - MockXMLHttpRequest.requests.length = 0; - MockXMLHttpRequest.recentRequest = null; - } - - private previousRequest: MockXMLHttpRequest; - - protected responseType: string = ''; - private eventHandlers: Array = []; - private readyState: number = 0; - - private user: any; - private password: any; - - private responseHeaders: any; - protected status: any; - protected responseText: string; - protected response: any; - - url: any; - method: any; - data: any; - requestHeaders: any = {}; - withCredentials: boolean = false; - - onreadystatechange: (e: ProgressEvent) => any; - onerror: (e: ErrorEvent) => any; - onprogress: (e: ProgressEvent) => any; - ontimeout: (e: ProgressEvent) => any; - upload: XMLHttpRequestUpload = { }; - - constructor() { - this.previousRequest = MockXMLHttpRequest.recentRequest; - MockXMLHttpRequest.recentRequest = this; - MockXMLHttpRequest.requests.push(this); - } - - send(data: any): void { - this.data = data; - } - - open(method: any, url: any, async: any, user: any, password: any): void { - this.method = method; - this.url = url; - this.user = user; - this.password = password; - this.readyState = 1; - this.triggerEvent('readyStateChange'); - const originalProgressHandler = this.upload.onprogress; - Object.defineProperty(this.upload, 'progress', { - get() { - return originalProgressHandler; - } - }); - } - - setRequestHeader(key: any, value: any): void { - this.requestHeaders[key] = value; - } - - addEventListener(name: string, handler: any): void { - this.eventHandlers.push({ name: name, handler: handler }); - } - - removeEventListener(name: string, handler: any): void { - for (let i = this.eventHandlers.length - 1; i--; ) { - let eh = this.eventHandlers[i]; - if (eh.name === name && eh.handler === handler) { - this.eventHandlers.splice(i, 1); - } - } - } - - throwError(err: any): void { - // TODO: something better with errors - this.triggerEvent('error'); - } - - protected jsonResponseValue(response: any) { - try { - this.response = JSON.parse(response.responseText); - } catch (err) { - throw new Error('unable to JSON.parse: \n' + response.responseText); - } - } - - protected defaultResponseValue() { - throw new Error('unhandled type "' + this.responseType + '"'); - } - - respondWith(response: any, progressTimes?: number): void { - if (progressTimes) { - for (let i = 1; i <= progressTimes; ++ i) { - this.triggerUploadEvent('progress', { type: 'ProgressEvent', total: progressTimes, loaded: i }); - } - } - this.readyState = 4; - this.responseHeaders = { - 'Content-Type': response.contentType || 'text/plain' - }; - this.status = response.status || 200; - this.responseText = response.responseText; - if (!('response' in response)) { - switch (this.responseType) { - case 'json': - this.jsonResponseValue(response); - break; - case 'text': - this.response = response.responseText; - break; - default: - this.defaultResponseValue(); - } - } - // TODO: pass better event to onload. - this.triggerEvent('load'); - this.triggerEvent('readystatechange'); - } - - triggerEvent(name: any, eventObj?: any): void { - // TODO: create a better default event - const e: any = eventObj || {}; - - if (this['on' + name]) { - this['on' + name](e); - } - - this.eventHandlers.forEach(function (eh) { - if (eh.name === name) { - eh.handler.call(this, e); - } - }); - } - - triggerUploadEvent(name: any, eventObj?: any): void { - // TODO: create a better default event - const e: any = eventObj || {}; - - if (this.upload['on' + name]) { - this.upload['on' + name](e); - } - } -} - -export class MockXMLHttpRequestInternetExplorer extends MockXMLHttpRequest { - - private mockHttp204() { - this.responseType = ''; - this.responseText = ''; - this.response = ''; - } - - protected jsonResponseValue(response: any) { - if (this.status == 204) { - this.mockHttp204(); - return; - } - return super.jsonResponseValue(response); - } - - protected defaultResponseValue() { - if (this.status == 204) { - this.mockHttp204(); - return; - } - return super.defaultResponseValue(); - } - - triggerUploadEvent(name: any, eventObj?: any): void { - // TODO: create a better default event - const e: any = eventObj || {}; - if (this['on' + name]) { - this['on' + name](e); - } - } -} diff --git a/spec/observables/dom/ajax-spec.ts b/spec/observables/dom/ajax-spec.ts index 51c8285d34..8ef9b8e668 100644 --- a/spec/observables/dom/ajax-spec.ts +++ b/spec/observables/dom/ajax-spec.ts @@ -2,7 +2,6 @@ import {expect} from 'chai'; import * as sinon from 'sinon'; import * as Rx from '../../../dist/cjs/Rx'; import {root} from '../../../dist/cjs/util/root'; -import {MockXMLHttpRequest, MockXMLHttpRequestInternetExplorer} from '../../helpers/ajax-helper'; declare const global: any; @@ -854,4 +853,193 @@ describe('Observable.ajax', () => { delete root.XMLHttpRequest.prototype.onerror; delete root.XMLHttpRequest.prototype.upload; }); -}); \ No newline at end of file +}); + +class MockXMLHttpRequest { + private static requests: Array = []; + private static recentRequest: MockXMLHttpRequest; + + static get mostRecent(): MockXMLHttpRequest { + return MockXMLHttpRequest.recentRequest; + } + + static get allRequests(): Array { + return MockXMLHttpRequest.requests; + } + + static clearRequest(): void { + MockXMLHttpRequest.requests.length = 0; + MockXMLHttpRequest.recentRequest = null; + } + + private previousRequest: MockXMLHttpRequest; + + protected responseType: string = ''; + private eventHandlers: Array = []; + private readyState: number = 0; + + private user: any; + private password: any; + + private responseHeaders: any; + protected status: any; + protected responseText: string; + protected response: any; + + url: any; + method: any; + data: any; + requestHeaders: any = {}; + withCredentials: boolean = false; + + onreadystatechange: (e: ProgressEvent) => any; + onerror: (e: ErrorEvent) => any; + onprogress: (e: ProgressEvent) => any; + ontimeout: (e: ProgressEvent) => any; + upload: XMLHttpRequestUpload = { }; + + constructor() { + this.previousRequest = MockXMLHttpRequest.recentRequest; + MockXMLHttpRequest.recentRequest = this; + MockXMLHttpRequest.requests.push(this); + } + + send(data: any): void { + this.data = data; + } + + open(method: any, url: any, async: any, user: any, password: any): void { + this.method = method; + this.url = url; + this.user = user; + this.password = password; + this.readyState = 1; + this.triggerEvent('readyStateChange'); + const originalProgressHandler = this.upload.onprogress; + Object.defineProperty(this.upload, 'progress', { + get() { + return originalProgressHandler; + } + }); + } + + setRequestHeader(key: any, value: any): void { + this.requestHeaders[key] = value; + } + + addEventListener(name: string, handler: any): void { + this.eventHandlers.push({ name: name, handler: handler }); + } + + removeEventListener(name: string, handler: any): void { + for (let i = this.eventHandlers.length - 1; i--; ) { + let eh = this.eventHandlers[i]; + if (eh.name === name && eh.handler === handler) { + this.eventHandlers.splice(i, 1); + } + } + } + + throwError(err: any): void { + // TODO: something better with errors + this.triggerEvent('error'); + } + + protected jsonResponseValue(response: any) { + try { + this.response = JSON.parse(response.responseText); + } catch (err) { + throw new Error('unable to JSON.parse: \n' + response.responseText); + } + } + + protected defaultResponseValue() { + throw new Error('unhandled type "' + this.responseType + '"'); + } + + respondWith(response: any, progressTimes?: number): void { + if (progressTimes) { + for (let i = 1; i <= progressTimes; ++ i) { + this.triggerUploadEvent('progress', { type: 'ProgressEvent', total: progressTimes, loaded: i }); + } + } + this.readyState = 4; + this.responseHeaders = { + 'Content-Type': response.contentType || 'text/plain' + }; + this.status = response.status || 200; + this.responseText = response.responseText; + if (!('response' in response)) { + switch (this.responseType) { + case 'json': + this.jsonResponseValue(response); + break; + case 'text': + this.response = response.responseText; + break; + default: + this.defaultResponseValue(); + } + } + // TODO: pass better event to onload. + this.triggerEvent('load'); + this.triggerEvent('readystatechange'); + } + + triggerEvent(name: any, eventObj?: any): void { + // TODO: create a better default event + const e: any = eventObj || {}; + + if (this['on' + name]) { + this['on' + name](e); + } + + this.eventHandlers.forEach(function (eh) { + if (eh.name === name) { + eh.handler.call(this, e); + } + }); + } + + triggerUploadEvent(name: any, eventObj?: any): void { + // TODO: create a better default event + const e: any = eventObj || {}; + + if (this.upload['on' + name]) { + this.upload['on' + name](e); + } + } +} + +class MockXMLHttpRequestInternetExplorer extends MockXMLHttpRequest { + + private mockHttp204() { + this.responseType = ''; + this.responseText = ''; + this.response = ''; + } + + protected jsonResponseValue(response: any) { + if (this.status == 204) { + this.mockHttp204(); + return; + } + return super.jsonResponseValue(response); + } + + protected defaultResponseValue() { + if (this.status == 204) { + this.mockHttp204(); + return; + } + return super.defaultResponseValue(); + } + + triggerUploadEvent(name: any, eventObj?: any): void { + // TODO: create a better default event + const e: any = eventObj || {}; + if (this['on' + name]) { + this['on' + name](e); + } + } +} diff --git a/spec/observables/dom/webSocket-spec.ts b/spec/observables/dom/webSocket-spec.ts index 8dc4cfe9fc..975f27e071 100644 --- a/spec/observables/dom/webSocket-spec.ts +++ b/spec/observables/dom/webSocket-spec.ts @@ -1,26 +1,26 @@ import {expect} from 'chai'; import * as sinon from 'sinon'; import * as Rx from '../../../dist/cjs/Rx'; -import {MockWebSocket} from '../../helpers/ajax-helper'; declare const __root__: any; const Observable = Rx.Observable; -let __ws: any; - -function setupMockWebSocket() { - MockWebSocket.clearSockets(); - __ws = __root__.WebSocket; - __root__.WebSocket = MockWebSocket; -} - -function teardownMockWebSocket() { - __root__.WebSocket = __ws; - MockWebSocket.clearSockets(); -} /** @test {webSocket} */ describe('Observable.webSocket', () => { + let __ws: any; + + function setupMockWebSocket() { + MockWebSocket.clearSockets(); + __ws = __root__.WebSocket; + __root__.WebSocket = MockWebSocket; + } + + function teardownMockWebSocket() { + __root__.WebSocket = __ws; + MockWebSocket.clearSockets(); + } + beforeEach(() => { setupMockWebSocket(); }); @@ -614,3 +614,80 @@ describe('Observable.webSocket', () => { }); }); }); + +class MockWebSocket { + static sockets: Array = []; + static get lastSocket(): MockWebSocket { + const socket = MockWebSocket.sockets; + const length = socket.length; + return length > 0 ? socket[length - 1] : undefined; + } + + static clearSockets(): void { + MockWebSocket.sockets.length = 0; + } + + sent: Array = []; + handlers: any = {}; + readyState: number = 0; + closeCode: any; + closeReason: any; + + constructor(public url: string, public protocol: string) { + MockWebSocket.sockets.push(this); + } + + send(data: any): void { + this.sent.push(data); + } + + get lastMessageSent(): any { + const sent = this.sent; + const length = sent.length; + + return length > 0 ? sent[length - 1] : undefined; + } + + triggerClose(e: any): void { + this.readyState = 3; + this.trigger('close', e); + } + + triggerMessage(data: any): void { + const messageEvent = { + data: data, + origin: 'mockorigin', + ports: undefined, + source: __root__, + }; + + this.trigger('message', messageEvent); + } + + open(): void { + this.readyState = 1; + this.trigger('open', {}); + } + + close(code: any, reason: any): void { + if (this.readyState < 2) { + this.readyState = 2; + this.closeCode = code; + this.closeReason = reason; + this.triggerClose({ wasClean: true }); + } + } + + trigger(name: string, e: any) { + if (this['on' + name]) { + this['on' + name](e); + } + + const lookup = this.handlers[name]; + if (lookup) { + for (let i = 0; i < lookup.length; i++) { + lookup[i](e); + } + } + } +} \ No newline at end of file diff --git a/spec/support/debug.opts b/spec/support/debug.opts index f8442c21d2..2287c7690a 100644 --- a/spec/support/debug.opts +++ b/spec/support/debug.opts @@ -1,5 +1,4 @@ --require source-map-support/register ---require spec-js/helpers/ajax-helper.js --require spec-js/helpers/testScheduler-ui.js --ui spec-js/helpers/testScheduler-ui.js diff --git a/spec/support/default.opts b/spec/support/default.opts index b14e29bd68..f24cb86f54 100644 --- a/spec/support/default.opts +++ b/spec/support/default.opts @@ -1,5 +1,4 @@ --require source-map-support/register ---require spec-js/helpers/ajax-helper.js --require spec-js/helpers/testScheduler-ui.js --ui spec-js/helpers/testScheduler-ui.js diff --git a/wallaby.js b/wallaby.js index 84203d35bf..b385c51402 100644 --- a/wallaby.js +++ b/wallaby.js @@ -40,7 +40,6 @@ module.exports = wallaby => ({ global.mocha = require('mocha'); global.Suite = global.mocha.Suite; global.Test = global.mocha.Test; - require('./spec/helpers/ajax-helper'); //delete global context due to avoid issue by reusing process //https://github.com/wallabyjs/public/issues/536