Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(219)

Unified Diff: third_party/pkg/angular/lib/mock/http_backend.dart

Issue 124053002: Adding Angular and dependent packages for testing (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 12 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/pkg/angular/lib/mock/http_backend.dart
diff --git a/third_party/pkg/angular/lib/mock/http_backend.dart b/third_party/pkg/angular/lib/mock/http_backend.dart
new file mode 100644
index 0000000000000000000000000000000000000000..27c773563c2063d6ccab38959fffd3f07d5729ef
--- /dev/null
+++ b/third_party/pkg/angular/lib/mock/http_backend.dart
@@ -0,0 +1,645 @@
+part of angular.mock;
+
+class _MockXhr {
+ var $$method, $$url, $$async, $$reqHeaders, $$respHeaders;
+
+ open(method, url, async) {
+ $$method = method;
+ $$url = url;
+ $$async = async;
+ $$reqHeaders = {};
+ $$respHeaders = {};
+ }
+
+ var $$data;
+
+ send(data) {
+ $$data = data;
+ }
+
+ setRequestHeader(key, value) {
+ $$reqHeaders[key] = value;
+ }
+
+ getResponseHeader(name) {
+ // the lookup must be case insensitive, that's why we try two quick lookups and full scan at last
+ if ($$respHeaders.containsKey(name)) {
+ return $$respHeaders[name];
+ }
+
+ name = name.toLowerCase();
+ if ($$respHeaders.containsKey(name)) {
+ return $$respHeaders[name];
+ }
+
+ String header = null;
+ $$respHeaders.forEach((headerName, headerVal) {
+ if (header != null) return;
+ if (headerName.toLowerCase()) header = headerVal;
+ });
+ return header;
+ }
+
+ getAllResponseHeaders() {
+ if ($$respHeaders == null) return '';
+
+ var lines = [];
+
+ $$respHeaders.forEach((key, value) {
+ lines.add("$key: $value");
+ });
+ return lines.join('\n');
+ }
+
+ // noop
+ abort() {}
+}
+
+/**
+ * An internal class used by [MockHttpBackend].
+ */
+class MockHttpExpectation {
+
+ var method, url, data, headers;
+
+ var response;
+
+ MockHttpExpectation(this.method, this.url, [this.data, this.headers]);
+
+ match(m, u, [d, h]) {
+ if (method != m) return false;
+ if (!matchUrl(u)) return false;
+ if (d != null && !matchData(d)) return false;
+ if (h != null && !matchHeaders(h)) return false;
+ return true;
+ }
+
+ matchUrl(u) {
+ if (url == null) return true;
+ if (url is RegExp) return url.hasMatch(u);
+ return url == u;
+ }
+
+ matchHeaders(h) {
+ if (headers == null) return true;
+ if (headers is Function) return headers(h);
+ return "$headers" == "$h";
+ }
+
+ matchData(d) {
+ if (data == null) return true;
+ if (d == null) return false; // data is not null, but d is.
+ if (data is File) return data == d;
+ assert(d is String);
+ if (data is RegExp) return data.hasMatch(d);
+ return JSON.encode(data) == JSON.encode(d);
+ }
+
+ toString() {
+ return "$method $url";
+ }
+}
+
+
+class _Chain {
+ var _respondFn;
+ _Chain({respond}) {
+ _respondFn = respond;
+ }
+ respond([x,y,z]) => _respondFn(x,y,z);
+}
+
+/**
+ * A mock implementation of [HttpBackend], used in tests.
+ */
+class MockHttpBackend implements HttpBackend {
+ var definitions = [],
+ expectations = [],
+ responses = [];
+
+ /**
+ * This function is called from [Http] and designed to mimic the Dart APIs.
+ */
+ dart_async.Future request(String url,
+ {String method, bool withCredentials, String responseType,
+ String mimeType, Map<String, String> requestHeaders, sendData,
+ void onProgress(ProgressEvent e)}) {
+ dart_async.Completer c = new dart_async.Completer();
+ var callback = (status, data, headers) {
+ if (status >= 200 && status < 300) {
+ c.complete(new MockHttpRequest(status, data, headers));
+ } else {
+ c.completeError(
+ new MockProgressEvent(
+ new MockHttpRequest(status, data, headers)));
+ }
+ };
+ call(method == null ? 'GET' : method, url, sendData, callback, requestHeaders);
+ return c.future;
+ }
+
+ _createResponse(status, data, headers) {
+ if (status is Function) return status;
+
+ return ([a,b,c,d,e]) {
+ return status is num
+ ? [status, data, headers]
+ : [200, status, data];
+ };
+ }
+
+
+ /**
+ * A callback oriented API. This function takes a callback with
+ * will be called with (status, data, headers)
+ */
+ call(method, [url, data, callback, headers, timeout]) {
+ var xhr = new _MockXhr(),
+ expectation = expectations.isEmpty ? null : expectations[0],
+ wasExpected = false;
+
+ var prettyPrint = (data) {
+ return (data is String || data is Function || data is RegExp)
+ ? data
+ : JSON.encode(data);
+ };
+
+ var wrapResponse = (wrapped) {
+ var handleResponse = () {
+ var response = wrapped.response(method, url, data, headers);
+ xhr.$$respHeaders = response[2];
+ utils.relaxFnApply(callback, [response[0], response[1], xhr.getAllResponseHeaders()]);
+ };
+
+ var handleTimeout = () {
+ for (var i = 0, ii = responses.length; i < ii; i++) {
+ if (identical(responses[i], handleResponse)) {
+ responses.removeAt(i);
+ callback(-1, null, '');
+ break;
+ }
+ }
+ };
+
+ if (timeout != null) timeout.then(handleTimeout);
+ return handleResponse;
+ };
+
+ if (expectation != null && expectation.match(method, url)) {
+ if (!expectation.matchData(data))
+ throw ['Expected $expectation with different data\n' +
+ 'EXPECTED: ${prettyPrint(expectation.data)}\nGOT: $data'];
+
+ if (!expectation.matchHeaders(headers))
+ throw ['Expected $expectation with different headers\n' +
+ 'EXPECTED: ${prettyPrint(expectation.headers)}\nGOT: ${prettyPrint(headers)}'];
+
+ expectations.removeAt(0);
+
+ if (expectation.response != null) {
+ responses.add(wrapResponse(expectation));
+ return;
+ }
+ wasExpected = true;
+ }
+
+ for (var definition in definitions) {
+ if (definition.match(method, url, data, headers != null ? headers : {})) {
+ if (definition.response != null) {
+ // if $browser specified, we do auto flush all requests
+ responses.add(wrapResponse(definition));
+ } else throw ['No response defined !'];
+ return;
+ }
+ }
+ throw wasExpected ?
+ ['No response defined !'] :
+ ['Unexpected request: $method $url\n' +
+ (expectation != null ? 'Expected $expectation' : 'No more requests expected')];
+ }
+
+ /**
+ * Creates a new backend definition.
+ *
+ * @param {string} method HTTP method.
+ * @param {string|RegExp} url HTTP url.
+ * @param {(string|RegExp)=} data HTTP request body.
+ * @param {(Object|function(Object))=} headers HTTP headers or function that receives http header
+ * object and returns true if the headers match the current definition.
+ * @returns {requestHandler} Returns an object with `respond` method that control how a matched
+ * request is handled.
+ *
+ * - respond – `{function([status,] data[, headers])|function(function(method, url, data, headers)}`
+ * – The respond method takes a set of static data to be returned or a function that can return
+ * an array containing response status (number), response data (string) and response headers
+ * (Object).
+ */
+ when(method, [url, data, headers]) {
+ var definition = new MockHttpExpectation(method, url, data, headers),
+ chain = new _Chain(respond: (status, data, headers) {
+ definition.response = _createResponse(status, data, headers);
+ });
+
+ definitions.add(definition);
+ return chain;
+ }
+
+ /**
+ * @ngdoc method
+ * @name ngMock.$httpBackend#whenGET
+ * @methodOf ngMock.$httpBackend
+ * @description
+ * Creates a new backend definition for GET requests. For more info see `when()`.
+ *
+ * @param {string|RegExp} url HTTP url.
+ * @param {(Object|function(Object))=} headers HTTP headers.
+ * @returns {requestHandler} Returns an object with `respond` method that control how a matched
+ * request is handled.
+ */
+
+
+ whenGET(url, [headers]) =>
+ when('GET', url, null, headers);
+ whenDELETE(url, [headers]) =>
+ when('DELETE', url, null, headers);
+ whenJSONP(url, [headers]) =>
+ when('JSONP', url, null, headers);
+
+ whenPUT(url, [data, headers]) =>
+ when('PUT', url, data, headers);
+ whenPOST(url, [data, headers]) =>
+ when('POST', url, data, headers);
+ whenPATCH(url, [data, headers]) =>
+ when('PATCH', url, data, headers);
+
+ /**
+ * @ngdoc method
+ * @name ngMock.$httpBackend#whenHEAD
+ * @methodOf ngMock.$httpBackend
+ * @description
+ * Creates a new backend definition for HEAD requests. For more info see `when()`.
+ *
+ * @param {string|RegExp} url HTTP url.
+ * @param {(Object|function(Object))=} headers HTTP headers.
+ * @returns {requestHandler} Returns an object with `respond` method that control how a matched
+ * request is handled.
+ */
+
+ /**
+ * @ngdoc method
+ * @name ngMock.$httpBackend#whenDELETE
+ * @methodOf ngMock.$httpBackend
+ * @description
+ * Creates a new backend definition for DELETE requests. For more info see `when()`.
+ *
+ * @param {string|RegExp} url HTTP url.
+ * @param {(Object|function(Object))=} headers HTTP headers.
+ * @returns {requestHandler} Returns an object with `respond` method that control how a matched
+ * request is handled.
+ */
+
+ /**
+ * @ngdoc method
+ * @name ngMock.$httpBackend#whenPOST
+ * @methodOf ngMock.$httpBackend
+ * @description
+ * Creates a new backend definition for POST requests. For more info see `when()`.
+ *
+ * @param {string|RegExp} url HTTP url.
+ * @param {(string|RegExp)=} data HTTP request body.
+ * @param {(Object|function(Object))=} headers HTTP headers.
+ * @returns {requestHandler} Returns an object with `respond` method that control how a matched
+ * request is handled.
+ */
+
+ /**
+ * @ngdoc method
+ * @name ngMock.$httpBackend#whenPUT
+ * @methodOf ngMock.$httpBackend
+ * @description
+ * Creates a new backend definition for PUT requests. For more info see `when()`.
+ *
+ * @param {string|RegExp} url HTTP url.
+ * @param {(string|RegExp)=} data HTTP request body.
+ * @param {(Object|function(Object))=} headers HTTP headers.
+ * @returns {requestHandler} Returns an object with `respond` method that control how a matched
+ * request is handled.
+ */
+
+ /**
+ * @ngdoc method
+ * @name ngMock.$httpBackend#whenJSONP
+ * @methodOf ngMock.$httpBackend
+ * @description
+ * Creates a new backend definition for JSONP requests. For more info see `when()`.
+ *
+ * @param {string|RegExp} url HTTP url.
+ * @returns {requestHandler} Returns an object with `respond` method that control how a matched
+ * request is handled.
+ */
+ //createShortMethods('when');
+
+
+ /**
+ * @ngdoc method
+ * @name ngMock.$httpBackend#expect
+ * @methodOf ngMock.$httpBackend
+ * @description
+ * Creates a new request expectation.
+ *
+ * @param {string} method HTTP method.
+ * @param {string|RegExp} url HTTP url.
+ * @param {(string|RegExp)=} data HTTP request body.
+ * @param {(Object|function(Object))=} headers HTTP headers or function that receives http header
+ * object and returns true if the headers match the current expectation.
+ * @returns {requestHandler} Returns an object with `respond` method that control how a matched
+ * request is handled.
+ *
+ * - respond – `{function([status,] data[, headers])|function(function(method, url, data, headers)}`
+ * – The respond method takes a set of static data to be returned or a function that can return
+ * an array containing response status (number), response data (string) and response headers
+ * (Object).
+ */
+ expect(method, [url, data, headers]) {
+ var expectation = new MockHttpExpectation(method, url, data, headers);
+ expectations.add(expectation);
+ return new _Chain(respond: (status, data, headers) {
+ expectation.response = _createResponse(status, data, headers);
+ });
+ }
+
+
+ /**
+ * @ngdoc method
+ * @name ngMock.$httpBackend#expectGET
+ * @methodOf ngMock.$httpBackend
+ * @description
+ * Creates a new request expectation for GET requests. For more info see `expect()`.
+ *
+ * @param {string|RegExp} url HTTP url.
+ * @param {Object=} headers HTTP headers.
+ * @returns {requestHandler} Returns an object with `respond` method that control how a matched
+ * request is handled. See #expect for more info.
+ */
+ expectGET(url, [headers]) =>
+ expect('GET', url, null, headers);
+ expectDELETE(url, [headers]) =>
+ expect('DELETE', url, null, headers);
+ expectJSONP(url, [headers]) =>
+ expect('JSONP', url, null, headers);
+
+ expectPUT(url, [data, headers]) =>
+ expect('PUT', url, data, headers);
+ expectPOST(url, [data, headers]) =>
+ expect('POST', url, data, headers);
+ expectPATCH(url, [data, headers]) =>
+ expect('PATCH', url, data, headers);
+
+ /**
+ * @ngdoc method
+ * @name ngMock.$httpBackend#expectHEAD
+ * @methodOf ngMock.$httpBackend
+ * @description
+ * Creates a new request expectation for HEAD requests. For more info see `expect()`.
+ *
+ * @param {string|RegExp} url HTTP url.
+ * @param {Object=} headers HTTP headers.
+ * @returns {requestHandler} Returns an object with `respond` method that control how a matched
+ * request is handled.
+ */
+
+ /**
+ * @ngdoc method
+ * @name ngMock.$httpBackend#expectDELETE
+ * @methodOf ngMock.$httpBackend
+ * @description
+ * Creates a new request expectation for DELETE requests. For more info see `expect()`.
+ *
+ * @param {string|RegExp} url HTTP url.
+ * @param {Object=} headers HTTP headers.
+ * @returns {requestHandler} Returns an object with `respond` method that control how a matched
+ * request is handled.
+ */
+
+ /**
+ * @ngdoc method
+ * @name ngMock.$httpBackend#expectPOST
+ * @methodOf ngMock.$httpBackend
+ * @description
+ * Creates a new request expectation for POST requests. For more info see `expect()`.
+ *
+ * @param {string|RegExp} url HTTP url.
+ * @param {(string|RegExp)=} data HTTP request body.
+ * @param {Object=} headers HTTP headers.
+ * @returns {requestHandler} Returns an object with `respond` method that control how a matched
+ * request is handled.
+ */
+
+ /**
+ * @ngdoc method
+ * @name ngMock.$httpBackend#expectPUT
+ * @methodOf ngMock.$httpBackend
+ * @description
+ * Creates a new request expectation for PUT requests. For more info see `expect()`.
+ *
+ * @param {string|RegExp} url HTTP url.
+ * @param {(string|RegExp)=} data HTTP request body.
+ * @param {Object=} headers HTTP headers.
+ * @returns {requestHandler} Returns an object with `respond` method that control how a matched
+ * request is handled.
+ */
+
+ /**
+ * @ngdoc method
+ * @name ngMock.$httpBackend#expectPATCH
+ * @methodOf ngMock.$httpBackend
+ * @description
+ * Creates a new request expectation for PATCH requests. For more info see `expect()`.
+ *
+ * @param {string|RegExp} url HTTP url.
+ * @param {(string|RegExp)=} data HTTP request body.
+ * @param {Object=} headers HTTP headers.
+ * @returns {requestHandler} Returns an object with `respond` method that control how a matched
+ * request is handled.
+ */
+
+ /**
+ * @ngdoc method
+ * @name ngMock.$httpBackend#expectJSONP
+ * @methodOf ngMock.$httpBackend
+ * @description
+ * Creates a new request expectation for JSONP requests. For more info see `expect()`.
+ *
+ * @param {string|RegExp} url HTTP url.
+ * @returns {requestHandler} Returns an object with `respond` method that control how a matched
+ * request is handled.
+ */
+ //createShortMethods('expect');
+
+
+ /**
+ * @ngdoc method
+ * @name ngMock.$httpBackend#flush
+ * @methodOf ngMock.$httpBackend
+ * @description
+ * Flushes all pending requests using the trained responses.
+ *
+ * @param {number=} count Number of responses to flush (in the order they arrived). If undefined,
+ * all pending requests will be flushed. If there are no pending requests when the flush method
+ * is called an exception is thrown (as this typically a sign of programming error).
+ */
+ flush([count]) {
+ if (responses.isEmpty) throw ['No pending request to flush !'];
+
+ if (count != null) {
+ while (count-- > 0) {
+ if (responses.isEmpty) throw ['No more pending request to flush !'];
+ responses.removeAt(0)();
+ }
+ } else {
+ while (!responses.isEmpty) {
+ responses.removeAt(0)();
+ }
+ }
+ verifyNoOutstandingExpectation();
+ }
+
+
+ /**
+ * @ngdoc method
+ * @name ngMock.$httpBackend#verifyNoOutstandingExpectation
+ * @methodOf ngMock.$httpBackend
+ * @description
+ * Verifies that all of the requests defined via the `expect` api were made. If any of the
+ * requests were not made, verifyNoOutstandingExpectation throws an exception.
+ *
+ * Typically, you would call this method following each test case that asserts requests using an
+ * "afterEach" clause.
+ *
+ * <pre>
+ * afterEach($httpBackend.verifyNoOutstandingExpectation);
+ * </pre>
+ */
+ verifyNoOutstandingExpectation() {
+ if (!expectations.isEmpty) {
+ throw ['Unsatisfied requests: ${expectations.join(', ')}'];
+ }
+ }
+
+
+ /**
+ * @ngdoc method
+ * @name ngMock.$httpBackend#verifyNoOutstandingRequest
+ * @methodOf ngMock.$httpBackend
+ * @description
+ * Verifies that there are no outstanding requests that need to be flushed.
+ *
+ * Typically, you would call this method following each test case that asserts requests using an
+ * "afterEach" clause.
+ *
+ * <pre>
+ * afterEach($httpBackend.verifyNoOutstandingRequest);
+ * </pre>
+ */
+ verifyNoOutstandingRequest() {
+ if (!responses.isEmpty) {
+ throw ['Unflushed requests: ${responses.length}'];
+ }
+ }
+
+
+ /**
+ * @ngdoc method
+ * @name ngMock.$httpBackend#resetExpectations
+ * @methodOf ngMock.$httpBackend
+ * @description
+ * Resets all request expectations, but preserves all backend definitions. Typically, you would
+ * call resetExpectations during a multiple-phase test when you want to reuse the same instance of
+ * $httpBackend mock.
+ */
+ resetExpectations() {
+ expectations.length = 0;
+ responses.length = 0;
+ }
+}
+
+/**
+ * Mock implementation of the [HttpRequest] object returned from the HttpBackend.
+ */
+class MockHttpRequest implements HttpRequest {
+ final bool supportsCrossOrigin = false;
+ final bool supportsLoadEndEvent = false;
+ final bool supportsOverrideMimeType = false;
+ final bool supportsProgressEvent = false;
+ final Events on = null;
+
+ final dart_async.Stream<ProgressEvent> onAbort = null;
+ final dart_async.Stream<ProgressEvent> onError = null;
+ final dart_async.Stream<ProgressEvent> onLoad = null;
+ final dart_async.Stream<ProgressEvent> onLoadEnd = null;
+ final dart_async.Stream<ProgressEvent> onLoadStart = null;
+ final dart_async.Stream<ProgressEvent> onProgress = null;
+ final dart_async.Stream<ProgressEvent> onReadyStateChange = null;
+
+ final dart_async.Stream<ProgressEvent> onTimeout = null;
+ final int readyState = 0;
+
+ get responseText => response == null ? null : "$response";
+ Map<String, String> get responseHeaders => null;
+ final responseXml = null;
+ final String statusText = null;
+ final HttpRequestUpload upload = null;
+
+ String responseType = null;
+ int timeout = 0;
+ bool withCredentials;
+
+ final int status;
+ final response;
+ final String headers;
+
+ MockHttpRequest(this.status, this.response, [this.headers]);
+
+ void abort() {}
+ bool dispatchEvent(Event event) => false;
+ String getAllResponseHeaders() {
+ if (headers == null) return null;
+ return headers;
+ }
+ String getResponseHeader(String header) => null;
+
+ void open(String method, String url, {bool async, String user, String password}) {}
+ void overrideMimeType(String override) {}
+ void send([data]) {}
+ void setRequestHeader(String header, String value) {}
+ void addEventListener(String type, EventListener listener, [bool useCapture]) {}
+ void removeEventListener(String type, EventListener listener, [bool useCapture]) {}
+}
+
+class MockProgressEvent implements ProgressEvent {
+ final bool bubbles = false;
+ final bool cancelable = false;
+ final DataTransfer clipboardData = null;
+ final EventTarget currentTarget;
+ final Element matchingTarget = null;
+ final bool defaultPrevented = false;
+ final int eventPhase = 0;
+ final bool lengthComputable = false;
+ final int loaded = 0;
+ final List<Node> path = null;
+ final int position = 0;
+ final Type runtimeType = null;
+ final EventTarget target = null;
+ final int timeStamp = 0;
+ final int total = 0;
+ final int totalSize = 0;
+ final String type = null;
+
+ bool cancelBubble = false;
+
+ MockProgressEvent(MockHttpRequest this.currentTarget);
+
+ void preventDefault() {}
+ void stopImmediatePropagation() {}
+ void stopPropagation() {}
+}

Powered by Google App Engine
This is Rietveld 408576698