blob: 8324d9b5e2a86927147be49dccfceb8ea4ee84ba [file] [log] [blame] [edit]
// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:js_interop';
import 'package:flutter/src/services/dom.dart';
/// Defines a new property on an Object.
@JS('Object.defineProperty')
external JSVoid objectDefineProperty(JSAny o, JSString symbol, JSAny desc);
void createGetter(JSAny mock, String key, JSAny? Function() get) {
objectDefineProperty(
mock,
key.toJS,
<String, JSFunction>{
'get': (() => get()).toJS,
}.jsify()!,
);
}
@JS()
@staticInterop
@anonymous
class DomXMLHttpRequestMock {
external factory DomXMLHttpRequestMock({
JSFunction? open,
JSString responseType,
JSNumber timeout,
JSBoolean withCredentials,
JSFunction? send,
JSFunction? setRequestHeader,
JSFunction addEventListener,
});
}
class TestHttpRequest {
TestHttpRequest() {
_mock = DomXMLHttpRequestMock(
open: open.toJS,
send: send.toJS,
setRequestHeader: setRequestHeader.toJS,
addEventListener: addEventListener.toJS,
);
// TODO(srujzs): This is needed for when we reify JS types. Right now, JSAny
// is a typedef for Object?, but when we reify, it'll be its own type.
final JSAny mock = _mock as JSAny;
createGetter(mock, 'headers', () => headers.jsify());
createGetter(mock,
'responseHeaders', () => responseHeaders.jsify());
createGetter(mock, 'status', () => status.toJS);
createGetter(mock, 'response', () => response.jsify());
}
late DomXMLHttpRequestMock _mock;
MockEvent? mockEvent;
Map<String, String> headers = <String, String>{};
int status = -1;
Object? response;
Map<String, String> get responseHeaders => headers;
JSVoid open(JSString method, JSString url, JSBoolean async) {}
JSVoid send() {}
JSVoid setRequestHeader(JSString name, JSString value) {
headers[name.toDart] = value.toDart;
}
JSVoid addEventListener(JSString type, DomEventListener listener) {
if (type.toDart == mockEvent?.type) {
final DartDomEventListener dartListener =
(listener as JSExportedDartFunction).toDart as DartDomEventListener;
dartListener(mockEvent!.event);
}
}
DomXMLHttpRequest getMock() => _mock as DomXMLHttpRequest;
}
class MockEvent {
MockEvent(this.type, this.event);
final String type;
final DomEvent event;
}