rx-player
Version:
Canal+ HTML5 Video Player
143 lines (128 loc) • 4.71 kB
text/typescript
import { describe, it, expect } from "vitest";
import type { ISerializedMediaError } from "../media_error";
import MediaError, { deserializeMediaError } from "../media_error";
describe("errors - MediaError", () => {
it("should format a MediaError", () => {
const reason = "test";
const mediaError = new MediaError("MEDIA_TIME_BEFORE_MANIFEST", reason, {
timeInfo: { position: 5, minPosition: 10, maxPosition: 100 },
});
expect(mediaError).toBeInstanceOf(Error);
expect(mediaError.name).toBe("MediaError");
expect(mediaError.type).toBe("MEDIA_ERROR");
expect(mediaError.code).toBe("MEDIA_TIME_BEFORE_MANIFEST");
expect(mediaError.fatal).toBe(false);
expect(mediaError.message).toBe("MEDIA_TIME_BEFORE_MANIFEST: test");
});
it("should be able to set it as fatal", () => {
const reason = "test";
const mediaError = new MediaError("MEDIA_TIME_AFTER_MANIFEST", reason, {
timeInfo: { position: 5, minPosition: 10, maxPosition: 100 },
});
mediaError.fatal = true;
expect(mediaError).toBeInstanceOf(Error);
expect(mediaError.name).toBe("MediaError");
expect(mediaError.type).toBe("MEDIA_ERROR");
expect(mediaError.code).toBe("MEDIA_TIME_AFTER_MANIFEST");
expect(mediaError.fatal).toBe(true);
expect(mediaError.message).toBe("MEDIA_TIME_AFTER_MANIFEST: test");
});
it("should filter in a valid error code", () => {
const reason = "test";
const mediaError = new MediaError("MEDIA_ERR_NETWORK", reason);
mediaError.fatal = true;
expect(mediaError).toBeInstanceOf(Error);
expect(mediaError.name).toBe("MediaError");
expect(mediaError.type).toBe("MEDIA_ERROR");
expect(mediaError.code).toBe("MEDIA_ERR_NETWORK");
expect(mediaError.fatal).toBe(true);
expect(mediaError.message).toBe("MEDIA_ERR_NETWORK: test");
});
it("should expose and serialize custom position metadata", () => {
const mediaError = new MediaError("MEDIA_TIME_BEFORE_MANIFEST", "test", {
timeInfo: {
position: 3,
minPosition: 10,
maxPosition: 20,
},
});
expect(mediaError.timeInfo).toEqual({
position: 3,
minPosition: 10,
maxPosition: 20,
});
expect(mediaError.serialize()).toEqual({
isSerializedError: true,
name: "MediaError",
code: "MEDIA_TIME_BEFORE_MANIFEST",
reason: "test",
tracks: undefined,
timeInfo: {
position: 3,
minPosition: 10,
maxPosition: 20,
},
});
});
it("should deserialize a serialized MediaError with timeInfo", () => {
const serializedError: ISerializedMediaError = {
isSerializedError: true,
name: "MediaError",
code: "MEDIA_TIME_BEFORE_MANIFEST",
reason: "test",
tracks: undefined,
timeInfo: {
position: 3,
minPosition: 10,
maxPosition: 20,
},
};
const mediaError = deserializeMediaError(serializedError);
expect(mediaError).toBeInstanceOf(MediaError);
expect(mediaError.code).toBe("MEDIA_TIME_BEFORE_MANIFEST");
expect(mediaError.message).toBe("MEDIA_TIME_BEFORE_MANIFEST: test");
expect(mediaError.timeInfo).toEqual(serializedError.timeInfo);
});
it("should deserialize a serialized MediaError with tracks", () => {
const serializedError: ISerializedMediaError = {
isSerializedError: true,
name: "MediaError",
code: "BUFFER_APPEND_ERROR",
reason: "test",
tracks: [
{
type: "audio",
track: {
id: "fra1",
audioDescription: false,
language: "fra",
normalized: "fra",
representations: [],
},
},
],
timeInfo: undefined,
};
const mediaError = deserializeMediaError(serializedError);
expect(mediaError).toBeInstanceOf(MediaError);
expect(mediaError.code).toBe("BUFFER_APPEND_ERROR");
expect(mediaError.message).toBe("BUFFER_APPEND_ERROR: test");
expect(mediaError.tracksInfo).toEqual(serializedError.tracks);
});
it("should deserialize a serialized MediaError without metadata", () => {
const serializedError = {
isSerializedError: true as const,
name: "MediaError" as const,
code: "MEDIA_ERR_NETWORK" as const,
reason: "test",
tracks: undefined,
timeInfo: undefined,
};
const mediaError = deserializeMediaError(serializedError);
expect(mediaError).toBeInstanceOf(MediaError);
expect(mediaError.code).toBe("MEDIA_ERR_NETWORK");
expect(mediaError.message).toBe("MEDIA_ERR_NETWORK: test");
expect(mediaError.timeInfo).toBeUndefined();
expect(mediaError.tracksInfo).toBeUndefined();
});
});