import { vCarousel } from "../src/vCarousel"; const errors=require("../src/errors.js"); describe("vCarousel", function() { let vCarouselTest : vCarousel; const videosWebDir="https://forge.chapril.org/Fab_Blab/vCarousel/src/branch/master/public/videos"; const fixture="
"; beforeEach(function() { vCarouselTest=new vCarousel(); document.body.insertAdjacentHTML('afterbegin', fixture); }); afterEach(function() { document.body.removeChild(document.getElementById('fixture')); }); it("Should be an instance of vCarousel", function() { expect(vCarouselTest).toBeInstanceOf(vCarousel); }); describe("Setting vCarousel", function() { it("Doit générer une erreur si tous les ids passés ne correspondent pas à des éléments HTML existants.", function() { expect(function() { return vCarouselTest.vContainers=["dontExistId","video1","video2"]; }).toThrowError(errors.elementNotFound+"dontExistId"); expect(function() { return vCarouselTest.vContainers=["video1","dontExistId","video2"]; }).toThrowError(errors.elementNotFound+"dontExistId"); expect(function() { return vCarouselTest.vContainers=["video1","video2","dontExistId"]; }).toThrowError(errors.elementNotFound+"dontExistId"); }); it("Doit générer une erreur si tous les ids passés ne correspondent pas à des éléments HTML contenant une vidéo.", function() { expect(function() { return vCarouselTest.vContainers=["noVideo","video1","video2"]; }).toThrowError(errors.videoNotFound+"noVideo"); expect(function() { return vCarouselTest.vContainers=["video1","noVideo","video2"]; }).toThrowError(errors.videoNotFound+"noVideo"); expect(function() { return vCarouselTest.vContainers=["video1","video2","noVideo"]; }).toThrowError(errors.videoNotFound+"noVideo"); }); it("Doit générer une erreur s'il n'y a pas au moins 2 ids valides passés pour les éléments HTML contenant les vidéos.", function() { expect(function() { return vCarouselTest.vContainers=["video1"]; }).toThrowError(errors.need2Videos); }); it("Ne doit pas générer d'erreur s'il y a au moins 2 ids passés correspondant à des éléments HTML valides et contenant chacun une vidéo.", function() { expect(function() { return vCarouselTest.vContainers=["video1","video2"]; }).not.toThrowError(); }); it("Ne doit pas prendre en compte l'id fourni pour la première vidéo à afficher, s'il ne correspond pas à une des vidéos fournies.", function() { vCarouselTest.vContainers=["video1","video2"]; vCarouselTest.firstVideoId="video3"; expect(vCarouselTest.firstVideoId).toBeUndefined(); }); it("Doit accepter un firstVideoId vide permettant de cacher toutes les vidéos au lancement.", function() { vCarouselTest.vContainers=["video1","video2"]; vCarouselTest.firstVideoId=""; expect(vCarouselTest.firstVideoId).toBe(""); }); }); describe("running vCarousel", function() { it("Doit générer une erreur si on lance le carrousel sans avoir fourni les éléments HTML contenant les vidéos.", function() { expect(function() { return vCarouselTest.run(); }).toThrowError(errors.needVideosProvided); }); it("Doit cacher toutes les vidéos si cela est demandé en option, aucune vidéo n'étant alors enregistrée comme en cours.", function() { const videosId=["video1","video2","video3"]; vCarouselTest.vContainers=videosId; vCarouselTest.firstVideoId=""; vCarouselTest.run(); for(let containerId of videosId) expect(document.getElementById(containerId).style.display).toBe("none"); expect(vCarouselTest.currentVideo).toBeUndefined(); }); it("Doit cacher toutes les vidéos, sauf celle passée en option, qui doit être enregistrée comme celle en cours.", function() { vCarouselTest.vContainers=["video1","video2","video3"]; vCarouselTest.firstVideoId="video3"; vCarouselTest.run(); expect(document.getElementById("video1").style.display).toBe("none"); expect(document.getElementById("video2").style.display).toBe("none"); expect(document.getElementById("video3").style.display).toBe("block"); expect(vCarouselTest.currentVideo).toEqual(document.querySelector("#video3 video")); }); it("Si aucune indication n'est passée en option, doit cacher toutes les vidéos, sauf la première qui doit être enregistrée comme celle en cours.", function() { vCarouselTest.vContainers=["video1","video2","video3"]; vCarouselTest.run(); expect(document.getElementById("video1").style.display).toBe("block"); expect(document.getElementById("video2").style.display).toBe("none"); expect(document.getElementById("video3").style.display).toBe("none"); expect(vCarouselTest.currentVideo).toEqual(document.querySelector("#video1 video")); }); it("Doit demander le lancement de la première vidéo affichée, si demandé en option.", function() { vCarouselTest.vContainers=["video1","video2","video3"]; vCarouselTest.firstVideoId="video2"; vCarouselTest.playFirstVideo=true; let currentVideo=document.querySelector("#video2 video"); spyOn(currentVideo, "play"); vCarouselTest.run(); expect(currentVideo.play).toHaveBeenCalled(); }); it("Ne doit pas demander le lancement de la première vidéo affichée, si cela n'est pas demandé en option.", function() { vCarouselTest.vContainers=["video1","video2","video3"]; vCarouselTest.firstVideoId="video3"; let currentVideo=document.querySelector("#video3 video"); spyOn(currentVideo, "play"); vCarouselTest.run(); expect(currentVideo.play).not.toHaveBeenCalled(); }); it("Doit passer d'une vidéo à l'autre et arrêter lorsqu'elles ont toutes été affichées.", function() { vCarouselTest.vContainers=["video1","video2","video3"]; vCarouselTest.run(); let currentVideo=document.querySelector("#video1 video"); // Fin de lecture de la première vidéo, on passe à la suivante : currentVideo.dispatchEvent(new Event("ended")); expect(document.getElementById("video1").style.display).toBe("none"); expect(document.getElementById("video2").style.display).toBe("block"); currentVideo=document.querySelector("#video2 video"); expect(vCarouselTest.currentVideo).toEqual(currentVideo); expect(window.location.hash).toEqual("#video2"); // Fin de la deuxième, on passe à la dernière : currentVideo.dispatchEvent(new Event("ended")); expect(document.getElementById("video2").style.display).toBe("none"); expect(document.getElementById("video3").style.display).toBe("block"); currentVideo=document.querySelector("#video3 video"); expect(vCarouselTest.currentVideo).toEqual(currentVideo); expect(window.location.hash).toEqual("#video3"); // Fin de la dernière, rien ne bouge : currentVideo.dispatchEvent(new Event("ended")); expect(document.getElementById("video3").style.display).toBe("block"); expect(vCarouselTest.currentVideo).toEqual(currentVideo); expect(window.location.hash).toEqual("#video3"); }); it("Si cela est demandé, le carrousel doit reprendre au début après avoir parcouru toutes les vidéos.", function() { vCarouselTest.vContainers=["video1","video2","video3"]; vCarouselTest.noStop=true; vCarouselTest.run(); let currentVideo=document.querySelector("#video1 video"); // Fin de lecture de la première vidéo, on passe à la suivante : currentVideo.dispatchEvent(new Event("ended")); currentVideo=document.querySelector("#video2 video"); // Fin de la deuxième, on passe à la dernière : currentVideo.dispatchEvent(new Event("ended")); currentVideo=document.querySelector("#video3 video"); // Fin de la dernière, on doit retourner à la première : currentVideo.dispatchEvent(new Event("ended")); expect(document.getElementById("video3").style.display).toBe("none"); expect(document.getElementById("video1").style.display).toBe("block"); currentVideo=document.querySelector("#video1 video"); expect(vCarouselTest.currentVideo).toEqual(currentVideo); expect(window.location.hash).toEqual("#video1"); }); it("Doit demander le lancement des nouvelles vidéos affichées, si cela est demandé en option.", function() { vCarouselTest.vContainers=["video1","video2","video3"]; vCarouselTest.playNextVideos=true; vCarouselTest.run(); let firstVideo=document.querySelector("#video1 video"); let nextVideo=document.querySelector("#video2 video"); spyOn(nextVideo, "play"); // Fin de lecture de la première vidéo, on passe à la suivante qui doit se lancer automatiquement : firstVideo.dispatchEvent(new Event("ended")); expect(nextVideo.play).toHaveBeenCalled(); }); it("Ne doit pas demander le lancement des nouvelles vidéos affichées, si cela n'est pas demandé en option.", function() { vCarouselTest.vContainers=["video1","video2","video3"]; vCarouselTest.firstVideoId="video2"; vCarouselTest.run(); let firstVideo=document.querySelector("#video2 video"); let nextVideo=document.querySelector("#video3 video"); spyOn(nextVideo, "play"); // Fin de lecture de la première vidéo, on passe à la suivante qui ne doit pas se lancer automatiquement : firstVideo.dispatchEvent(new Event("ended")); expect(nextVideo.play).not.toHaveBeenCalled(); }); }); });