Add eachHttpClient test option to get basic coverage for new fetchhttpclient
This commit is contained in:
parent
71a8092cb9
commit
2be0ffae19
|
|
@ -1,8 +1,9 @@
|
||||||
// Copyright (c) .NET Foundation. All rights reserved.
|
// Copyright (c) .NET Foundation. All rights reserved.
|
||||||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
import { HttpTransportType, IHubProtocol, JsonHubProtocol } from "@microsoft/signalr";
|
import { DefaultHttpClient, FetchHttpClient, HttpClient, HttpTransportType, IHubProtocol, JsonHubProtocol, XhrHttpClient } from "@microsoft/signalr";
|
||||||
import { MessagePackHubProtocol } from "@microsoft/signalr-protocol-msgpack";
|
import { MessagePackHubProtocol } from "@microsoft/signalr-protocol-msgpack";
|
||||||
|
import { TestLogger } from "./TestLogger";
|
||||||
|
|
||||||
// On slower CI machines, these tests sometimes take longer than 5s
|
// On slower CI machines, these tests sometimes take longer than 5s
|
||||||
jasmine.DEFAULT_TIMEOUT_INTERVAL = 20 * 1000;
|
jasmine.DEFAULT_TIMEOUT_INTERVAL = 20 * 1000;
|
||||||
|
|
@ -100,3 +101,11 @@ export function eachTransportAndProtocol(action: (transport: HttpTransportType,
|
||||||
export function getGlobalObject(): any {
|
export function getGlobalObject(): any {
|
||||||
return typeof window !== "undefined" ? window : global;
|
return typeof window !== "undefined" ? window : global;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function eachHttpClient(action: (transport: HttpClient) => void) {
|
||||||
|
const httpClients: HttpClient[] = [new FetchHttpClient(TestLogger.instance), new XhrHttpClient(TestLogger.instance), new DefaultHttpClient(TestLogger.instance)];
|
||||||
|
|
||||||
|
return httpClients.forEach((t) => {
|
||||||
|
return action(t);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@
|
||||||
// tslint:disable:no-floating-promises
|
// tslint:disable:no-floating-promises
|
||||||
|
|
||||||
import { HttpTransportType, IHttpConnectionOptions, TransferFormat } from "@microsoft/signalr";
|
import { HttpTransportType, IHttpConnectionOptions, TransferFormat } from "@microsoft/signalr";
|
||||||
import { eachTransport, ECHOENDPOINT_URL } from "./Common";
|
import { eachHttpClient, eachTransport, ECHOENDPOINT_URL } from "./Common";
|
||||||
import { TestLogger } from "./TestLogger";
|
import { TestLogger } from "./TestLogger";
|
||||||
|
|
||||||
// We want to continue testing HttpConnection, but we don't export it anymore. So just pull it in directly from the source file.
|
// We want to continue testing HttpConnection, but we don't export it anymore. So just pull it in directly from the source file.
|
||||||
|
|
@ -44,109 +44,114 @@ describe("connection", () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
eachTransport((transportType) => {
|
eachTransport((transportType) => {
|
||||||
describe(`over ${HttpTransportType[transportType]}`, () => {
|
eachHttpClient((httpClient) => {
|
||||||
it("can send and receive messages", (done) => {
|
describe(`over ${HttpTransportType[transportType]}`, () => {
|
||||||
const message = "Hello World!";
|
it("can send and receive messages", (done) => {
|
||||||
// the url should be resolved relative to the document.location.host
|
const message = "Hello World!";
|
||||||
// and the leading '/' should be automatically added to the url
|
// the url should be resolved relative to the document.location.host
|
||||||
const connection = new HttpConnection(ECHOENDPOINT_URL, {
|
// and the leading '/' should be automatically added to the url
|
||||||
...commonOptions,
|
const connection = new HttpConnection(ECHOENDPOINT_URL, {
|
||||||
transport: transportType,
|
...commonOptions,
|
||||||
});
|
httpClient,
|
||||||
|
transport: transportType,
|
||||||
|
});
|
||||||
|
|
||||||
connection.onreceive = (data: any) => {
|
connection.onreceive = (data: any) => {
|
||||||
if (data === message) {
|
if (data === message) {
|
||||||
connection.stop();
|
connection.stop();
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
connection.onclose = (error: any) => {
|
|
||||||
expect(error).toBeUndefined();
|
|
||||||
done();
|
|
||||||
};
|
|
||||||
|
|
||||||
connection.start(TransferFormat.Text).then(() => {
|
|
||||||
connection.send(message);
|
|
||||||
}).catch((e: any) => {
|
|
||||||
fail(e);
|
|
||||||
done();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
it("does not log content of messages sent or received by default", (done) => {
|
|
||||||
TestLogger.saveLogsAndReset();
|
|
||||||
const message = "Hello World!";
|
|
||||||
|
|
||||||
// DON'T use commonOptions because we want to specifically test the scenario where logMessageContent is not set.
|
|
||||||
const connection = new HttpConnection(ECHOENDPOINT_URL, {
|
|
||||||
logger: TestLogger.instance,
|
|
||||||
transport: transportType,
|
|
||||||
});
|
|
||||||
|
|
||||||
connection.onreceive = (data: any) => {
|
|
||||||
if (data === message) {
|
|
||||||
connection.stop();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// @ts-ignore: We don't use the error parameter intentionally.
|
|
||||||
connection.onclose = (error) => {
|
|
||||||
// Search the logs for the message content
|
|
||||||
expect(TestLogger.instance.currentLog.messages.length).toBeGreaterThan(0);
|
|
||||||
// @ts-ignore: We don't use the _ or __ parameters intentionally.
|
|
||||||
for (const [_, __, logMessage] of TestLogger.instance.currentLog.messages) {
|
|
||||||
expect(logMessage).not.toContain(message);
|
|
||||||
}
|
|
||||||
done();
|
|
||||||
};
|
|
||||||
|
|
||||||
connection.start(TransferFormat.Text).then(() => {
|
|
||||||
connection.send(message);
|
|
||||||
}).catch((e) => {
|
|
||||||
fail(e);
|
|
||||||
done();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
it("does log content of messages sent or received when enabled", (done) => {
|
|
||||||
TestLogger.saveLogsAndReset();
|
|
||||||
const message = "Hello World!";
|
|
||||||
|
|
||||||
// DON'T use commonOptions because we want to specifically test the scenario where logMessageContent is set to true (even if commonOptions changes).
|
|
||||||
const connection = new HttpConnection(ECHOENDPOINT_URL, {
|
|
||||||
logMessageContent: true,
|
|
||||||
logger: TestLogger.instance,
|
|
||||||
transport: transportType,
|
|
||||||
});
|
|
||||||
|
|
||||||
connection.onreceive = (data: any) => {
|
|
||||||
if (data === message) {
|
|
||||||
connection.stop();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// @ts-ignore: We don't use the error parameter intentionally.
|
|
||||||
connection.onclose = (error) => {
|
|
||||||
// Search the logs for the message content
|
|
||||||
let matches = 0;
|
|
||||||
expect(TestLogger.instance.currentLog.messages.length).toBeGreaterThan(0);
|
|
||||||
// @ts-ignore: We don't use the _ or __ parameters intentionally.
|
|
||||||
for (const [_, __, logMessage] of TestLogger.instance.currentLog.messages) {
|
|
||||||
if (logMessage.indexOf(message) !== -1) {
|
|
||||||
matches += 1;
|
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
// One match for send, one for receive.
|
connection.onclose = (error: any) => {
|
||||||
expect(matches).toEqual(2);
|
expect(error).toBeUndefined();
|
||||||
done();
|
done();
|
||||||
};
|
};
|
||||||
|
|
||||||
connection.start(TransferFormat.Text).then(() => {
|
connection.start(TransferFormat.Text).then(() => {
|
||||||
connection.send(message);
|
connection.send(message);
|
||||||
}).catch((e: any) => {
|
}).catch((e: any) => {
|
||||||
fail(e);
|
fail(e);
|
||||||
done();
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it("does not log content of messages sent or received by default", (done) => {
|
||||||
|
TestLogger.saveLogsAndReset();
|
||||||
|
const message = "Hello World!";
|
||||||
|
|
||||||
|
// DON'T use commonOptions because we want to specifically test the scenario where logMessageContent is not set.
|
||||||
|
const connection = new HttpConnection(ECHOENDPOINT_URL, {
|
||||||
|
httpClient,
|
||||||
|
logger: TestLogger.instance,
|
||||||
|
transport: transportType,
|
||||||
|
});
|
||||||
|
|
||||||
|
connection.onreceive = (data: any) => {
|
||||||
|
if (data === message) {
|
||||||
|
connection.stop();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// @ts-ignore: We don't use the error parameter intentionally.
|
||||||
|
connection.onclose = (error) => {
|
||||||
|
// Search the logs for the message content
|
||||||
|
expect(TestLogger.instance.currentLog.messages.length).toBeGreaterThan(0);
|
||||||
|
// @ts-ignore: We don't use the _ or __ parameters intentionally.
|
||||||
|
for (const [_, __, logMessage] of TestLogger.instance.currentLog.messages) {
|
||||||
|
expect(logMessage).not.toContain(message);
|
||||||
|
}
|
||||||
|
done();
|
||||||
|
};
|
||||||
|
|
||||||
|
connection.start(TransferFormat.Text).then(() => {
|
||||||
|
connection.send(message);
|
||||||
|
}).catch((e) => {
|
||||||
|
fail(e);
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it("does log content of messages sent or received when enabled", (done) => {
|
||||||
|
TestLogger.saveLogsAndReset();
|
||||||
|
const message = "Hello World!";
|
||||||
|
|
||||||
|
// DON'T use commonOptions because we want to specifically test the scenario where logMessageContent is set to true (even if commonOptions changes).
|
||||||
|
const connection = new HttpConnection(ECHOENDPOINT_URL, {
|
||||||
|
httpClient,
|
||||||
|
logMessageContent: true,
|
||||||
|
logger: TestLogger.instance,
|
||||||
|
transport: transportType,
|
||||||
|
});
|
||||||
|
|
||||||
|
connection.onreceive = (data: any) => {
|
||||||
|
if (data === message) {
|
||||||
|
connection.stop();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// @ts-ignore: We don't use the error parameter intentionally.
|
||||||
|
connection.onclose = (error) => {
|
||||||
|
// Search the logs for the message content
|
||||||
|
let matches = 0;
|
||||||
|
expect(TestLogger.instance.currentLog.messages.length).toBeGreaterThan(0);
|
||||||
|
// @ts-ignore: We don't use the _ or __ parameters intentionally.
|
||||||
|
for (const [_, __, logMessage] of TestLogger.instance.currentLog.messages) {
|
||||||
|
if (logMessage.indexOf(message) !== -1) {
|
||||||
|
matches += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// One match for send, one for receive.
|
||||||
|
expect(matches).toEqual(2);
|
||||||
|
done();
|
||||||
|
};
|
||||||
|
|
||||||
|
connection.start(TransferFormat.Text).then(() => {
|
||||||
|
connection.send(message);
|
||||||
|
}).catch((e: any) => {
|
||||||
|
fail(e);
|
||||||
|
done();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,7 @@ export { AbortSignal } from "./AbortController";
|
||||||
export { AbortError, HttpError, TimeoutError } from "./Errors";
|
export { AbortError, HttpError, TimeoutError } from "./Errors";
|
||||||
export { HttpClient, HttpRequest, HttpResponse } from "./HttpClient";
|
export { HttpClient, HttpRequest, HttpResponse } from "./HttpClient";
|
||||||
export { DefaultHttpClient } from "./DefaultHttpClient";
|
export { DefaultHttpClient } from "./DefaultHttpClient";
|
||||||
|
export { FetchHttpClient } from "./FetchHttpClient";
|
||||||
export { IHttpConnectionOptions } from "./IHttpConnectionOptions";
|
export { IHttpConnectionOptions } from "./IHttpConnectionOptions";
|
||||||
export { HubConnection, HubConnectionState } from "./HubConnection";
|
export { HubConnection, HubConnectionState } from "./HubConnection";
|
||||||
export { HubConnectionBuilder } from "./HubConnectionBuilder";
|
export { HubConnectionBuilder } from "./HubConnectionBuilder";
|
||||||
|
|
@ -22,3 +23,4 @@ export { NullLogger } from "./Loggers";
|
||||||
export { JsonHubProtocol } from "./JsonHubProtocol";
|
export { JsonHubProtocol } from "./JsonHubProtocol";
|
||||||
export { Subject } from "./Subject";
|
export { Subject } from "./Subject";
|
||||||
export { IRetryPolicy, RetryContext } from "./IRetryPolicy";
|
export { IRetryPolicy, RetryContext } from "./IRetryPolicy";
|
||||||
|
export { XhrHttpClient } from "./XhrHttpClient";
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue