diff --git a/.gitignore b/.gitignore index defda06..4bff068 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ node_modules/ dist/ app/node_modules/ ext/node_modules/ +test/ChromeProfile/ diff --git a/README.md b/README.md index b1eb63e..7446582 100644 --- a/README.md +++ b/README.md @@ -26,11 +26,10 @@ Only tested on Linux. mDNS library issue to be fixed. `mdns` only works on Windo ### Instructions -```` +````sh git clone https://github.com/hensm/caster.git npm install npm run build -npm test ```` Installer scripts aren't written yet, so registering the native messaging manifest with Firefox and specifiying the path must be done manually: @@ -39,6 +38,19 @@ Installer scripts aren't written yet, so registering the native messaging manife `path` key within `app/caster_bridge.json` must be set to absolute path of `app/src/launcher.sh` or `app/src/launcher.bat`. Then, the manifest must be either moved to the correct location or the path added to the registry (Windows): [MDN: Native Manifests # Manifest location](https://developer.mozilla.org/en-US/Add-ons/WebExtensions/Native_manifests#Manifest_location) +### Testing + +Testing requires geckodriver (or chromedriver for Chrome parity testing). See [selenium-webdriver](https://www.npmjs.com/package/selenium-webdriver#installation) installation instructions (ignore `npm install`). + +Chrome doesn't load the media router in a temporary selenium profile, so there's a bundled profile (`test/ChromeProfile.zip`). Extract the folder within as `test/ChromeProfile/`. + +````sh +npm run build +npm test +SELENIUM_BROWSER=chrome npm test +```` + + ## Usage Extension can be loaded from `about:debugging` as a temporary extension. diff --git a/package.json b/package.json index 003ebc1..24c8b67 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,6 @@ "postinstall:app": "npm install ./app --prefix ./app", "postinstall:ext": "npm install ./ext --prefix ./ext", "build": "npm run build --prefix ./ext", - "pretest": "npm run build", "test": "jasmine --config=jasmine.json" }, "devDependencies": { diff --git a/test/ChromeProfile.zip b/test/ChromeProfile.zip new file mode 100644 index 0000000..6663ea7 Binary files /dev/null and b/test/ChromeProfile.zip differ diff --git a/test/driver.js b/test/driver.js index 85103b6..f7fbbde 100644 --- a/test/driver.js +++ b/test/driver.js @@ -17,7 +17,7 @@ const firefoxOptions = new firefox.Options() const chromeOptions = new chrome.Options() .excludeSwitches("disable-default-apps") .addArguments( - "--load-media-router-component-extension"); + `--user-data-dir=${path.resolve(__dirname, "ChromeProfile")}`); async function create () { diff --git a/test/spec/chrome.spec.js b/test/spec/chrome.spec.js index bb36780..4b748aa 100644 --- a/test/spec/chrome.spec.js +++ b/test/spec/chrome.spec.js @@ -14,7 +14,7 @@ describe("chrome", () => { }); - it("should exist", async () => { + it("should exist", () => { expect(chrome).toBeDefined(); expect(chrome.cast).toBeDefined(); expect(chrome.cast.media).toBeDefined(); @@ -22,7 +22,7 @@ describe("chrome", () => { describe("chrome.cast", () => { - it("should have all api functions", async () => { + it("should have all api methods", () => { expect(chrome.cast.addReceiverActionListener).toBeDefined(); expect(chrome.cast.initialize).toBeDefined(); expect(chrome.cast.logMessage).toBeDefined(); @@ -36,7 +36,7 @@ describe("chrome", () => { expect(chrome.cast.unescape).toBeDefined(); }); - it("should have all api classes", async () => { + it("should have all api classes", () => { expect(chrome.cast.ApiConfig).toBeDefined(); expect(chrome.cast.DialRequest).toBeDefined(); expect(chrome.cast.Error).toBeDefined(); @@ -50,7 +50,7 @@ describe("chrome", () => { expect(chrome.cast.Volume).toBeDefined(); }); - it("should have all api enums", async () => { + it("should have all api enums", () => { expect(chrome.cast.AutoJoinPolicy).toEqual(jasmine.objectContaining({ CUSTOM_CONTROLLER_SCOPED: "custom_controller_scoped" , TAB_AND_ORIGIN_SCOPED: "tab_and_origin_scoped" @@ -128,6 +128,126 @@ describe("chrome", () => { }); describe("chrome.cast.media", () => { + it ("should have all api classes", () => { + expect(chrome.cast.media.EditTracksInfoRequest).toBeDefined(); + expect(chrome.cast.media.GenericMediaMetadata).toBeDefined(); + expect(chrome.cast.media.GetStatusRequest).toBeDefined(); + expect(chrome.cast.media.LoadRequest).toBeDefined(); + expect(chrome.cast.media.Media).toBeDefined(); + expect(chrome.cast.media.MediaInfo).toBeDefined(); + expect(chrome.cast.media.MovieMediaMetadata).toBeDefined(); + expect(chrome.cast.media.MusicTrackMediaMetadata).toBeDefined(); + expect(chrome.cast.media.PauseRequest).toBeDefined(); + expect(chrome.cast.media.PhotoMediaMetadata).toBeDefined(); + expect(chrome.cast.media.PlayRequest).toBeDefined(); + expect(chrome.cast.media.QueueInsertItemsRequest).toBeDefined(); + expect(chrome.cast.media.QueueItem).toBeDefined(); + expect(chrome.cast.media.QueueLoadRequest).toBeDefined(); + expect(chrome.cast.media.QueueRemoveItemsRequest).toBeDefined(); + expect(chrome.cast.media.QueueReorderItemsRequest).toBeDefined(); + expect(chrome.cast.media.QueueUpdateItemsRequest).toBeDefined(); + expect(chrome.cast.media.SeekRequest).toBeDefined(); + expect(chrome.cast.media.StopRequest).toBeDefined(); + expect(chrome.cast.media.TextTrackStyle).toBeDefined(); + expect(chrome.cast.media.Track).toBeDefined(); + expect(chrome.cast.media.TvShowMediaMetadata).toBeDefined(); + expect(chrome.cast.media.VolumeRequest).toBeDefined(); + }); + it ("should have all api enums", () => { + expect(chrome.cast.media.IdleReason).toEqual(jasmine.objectContaining({ + CANCELLED: "CANCELLED" + , INTERRUPTED: "INTERRUPTED" + , FINISHED: "FINISHED" + , ERROR: "ERROR" + })); + expect(chrome.cast.media.MediaCommand).toEqual(jasmine.objectContaining({ + PAUSE: "pause" + , SEEK: "seek" + , STREAM_VOLUME: "stream_volume" + , STREAM_MUTE: "stream_mute" + })); + expect(chrome.cast.media.MetadataType).toEqual(jasmine.objectContaining({ + GENERIC: 0 + , MOVIE: 1 + , TV_SHOW: 2 + , MUSIC_TRACK: 3 + , PHOTO: 4 + })); + expect(chrome.cast.media.PlayerState).toEqual(jasmine.objectContaining({ + IDLE: "IDLE" + , PLAYING: "PLAYING" + , PAUSED: "PAUSED" + , BUFFERING: "BUFFERING" + })); + expect(chrome.cast.media.RepeatMode).toEqual(jasmine.objectContaining({ + OFF: "REPEAT_OFF" + , ALL: "REPEAT_ALL" + , SINGLE: "REPEAT_SINGLE" + , ALL_AND_SHUFFLE: "REPEAT_ALL_AND_SHUFFLE" + })); + expect(chrome.cast.media.ResumeState).toEqual(jasmine.objectContaining({ + PLAYBACK_START: "PLAYBACK_START" + , PLAYBACK_PAUSE: "PLAYBACK_PAUSE" + })); + expect(chrome.cast.media.StreamType).toEqual(jasmine.objectContaining({ + BUFFERED: "BUFFERED" + , LIVE: "LIVE" + , OTHER: "OTHER" + })); + expect(chrome.cast.media.TextTrackEdgeType).toEqual(jasmine.objectContaining({ + NONE: "NONE" + , OUTLINE: "OUTLINE" + , DROP_SHADOW: "DROP_SHADOW" + , RAISED: "RAISED" + , DEPRESSED: "DEPRESSED" + })); + expect(chrome.cast.media.TextTrackFontGenericFamily).toEqual(jasmine.objectContaining({ + SANS_SERIF: "SANS_SERIF" + , MONOSPACED_SANS_SERIF: "MONOSPACED_SANS_SERIF" + , SERIF: "SERIF" + , MONOSPACED_SERIF: "MONOSPACED_SERIF" + , CASUAL: "CASUAL" + , CURSIVE: "CURSIVE" + , SMALL_CAPITALS: "SMALL_CAPITALS" + })); + expect(chrome.cast.media.TextTrackFontStyle).toEqual(jasmine.objectContaining({ + NORMAL: "NORMAL" + , BOLD: "BOLD" + , BOLD_ITALIC: "BOLD_ITALIC" + , ITALIC: "ITALIC" + })); + expect(chrome.cast.media.TextTrackType).toEqual(jasmine.objectContaining({ + SUBTITLES: "SUBTITLES" + , CAPTIONS: "CAPTIONS" + , DESCRIPTIONS: "DESCRIPTIONS" + , CHAPTERS: "CHAPTERS" + , METADATA: "METADATA" + })); + expect(chrome.cast.media.TextTrackWindowType).toEqual(jasmine.objectContaining({ + NONE: "NONE" + , NORMAL: "NORMAL" + , ROUNDED_CORNERS: "ROUNDED_CORNERS" + })); + expect(chrome.cast.media.TrackType).toEqual(jasmine.objectContaining({ + TEXT: "TEXT" + , AUDIO: "AUDIO" + , VIDEO: "VIDEO" + })); + }); + + describe("chrome.cast.media.timeout", () => { + it ("should have all properties", () => { + expect(chrome.cast.media.timeout.editTracksInfo).toBe(0); + expect(chrome.cast.media.timeout.getStatus).toBe(0); + expect(chrome.cast.media.timeout.load).toBe(0); + expect(chrome.cast.media.timeout.pause).toBe(0); + expect(chrome.cast.media.timeout.play).toBe(0); + expect(chrome.cast.media.timeout.queue).toBe(0); + expect(chrome.cast.media.timeout.seek).toBe(0); + expect(chrome.cast.media.timeout.setVolume).toBe(0); + expect(chrome.cast.media.timeout.stop).toBe(0); + }) + }); }); });