/** * @license Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved. * For licensing, see LICENSE.md. */ import MediaRegistry from '../src/mediaregistry'; import log from '@ckeditor/ckeditor5-utils/src/log'; describe( 'MediaRegistry', () => { describe( 'constructor()', () => { it( 'filters out providers that should be removed', () => { const providers = [ { name: 'dailymotion', url: [] }, { name: 'spotify', url: [] }, { name: 'youtube', url: [] }, { name: 'vimeo', url: [] }, ]; const removeProviders = [ 'spotify' ]; const mediaRegistry = new MediaRegistry( {}, { providers, removeProviders } ); const availableProviders = mediaRegistry.providerDefinitions.map( provider => provider.name ); expect( availableProviders ).to.deep.equal( [ 'dailymotion', 'youtube', 'vimeo' ] ); } ); it( 'allows extending providers using `extraProviders` option', () => { const providers = [ { name: 'dailymotion', url: [] }, { name: 'youtube', url: [] }, { name: 'vimeo', url: [] }, ]; const extraProviders = [ { name: 'spotify', url: [] }, ]; const mediaRegistry = new MediaRegistry( {}, { providers, extraProviders } ); const availableProviders = mediaRegistry.providerDefinitions.map( provider => provider.name ); expect( availableProviders ).to.deep.equal( [ 'dailymotion', 'youtube', 'vimeo', 'spotify' ] ); } ); it( 'logs a warning when provider\'s name is not defined', () => { const logStub = sinon.stub( log, 'warn' ); const providers = [ { url: [ /dailymotion\.com/ ] }, { name: 'spotify', url: [] }, { name: 'youtube', url: [] }, { name: 'vimeo', url: [] }, ]; const mediaRegistry = new MediaRegistry( {}, { providers } ); const availableProviders = mediaRegistry.providerDefinitions.map( provider => provider.name ); expect( availableProviders ).to.deep.equal( [ 'spotify', 'youtube', 'vimeo' ] ); expect( logStub.calledOnce ).to.equal( true ); expect( logStub.firstCall.args[ 0 ] ).to.equal( 'media-embed-no-provider-name: The configured media provider has no name and cannot be used.' ); expect( logStub.firstCall.args[ 1 ] ).to.deep.equal( { provider: { url: [ /dailymotion\.com/ ] } } ); } ); } ); describe( '_getMedia()', () => { let mediaRegistry, htmlSpy; beforeEach( () => { htmlSpy = sinon.spy(); mediaRegistry = new MediaRegistry( {}, { providers: [ { name: 'youtube', url: [ /^youtube\.com\/watch\?v=([\w-]+)/, /^youtube\.com\/v\/([\w-]+)/, /^youtube\.com\/embed\/([\w-]+)/, /^youtu\.be\/([\w-]+)/ ], html: htmlSpy } ] } ); } ); it( 'works fine for url with sub-domain and the protocol', () => { const media = mediaRegistry._getMedia( 'https://www.youtube.com/watch?v=euqbMkM-QQk' ); expect( media ).is.not.null; expect( media.url ).to.equal( 'https://www.youtube.com/watch?v=euqbMkM-QQk' ); } ); it( 'works fine for url with defined protocol', () => { const media = mediaRegistry._getMedia( 'https://youtube.com/watch?v=euqbMkM-QQk' ); expect( media ).is.not.null; expect( media.url ).to.equal( 'https://youtube.com/watch?v=euqbMkM-QQk' ); } ); it( 'works fine for url with sub-domain without protocol', () => { const media = mediaRegistry._getMedia( 'www.youtube.com/watch?v=euqbMkM-QQk' ); expect( media ).is.not.null; expect( media.url ).to.equal( 'https://www.youtube.com/watch?v=euqbMkM-QQk' ); } ); it( 'works fine for url without protocol', () => { const media = mediaRegistry._getMedia( 'youtube.com/watch?v=euqbMkM-QQk' ); expect( media ).is.not.null; expect( media.url ).to.equal( 'https://youtube.com/watch?v=euqbMkM-QQk' ); } ); it( 'passes the entire match array to render function', () => { const media = mediaRegistry._getMedia( 'https://www.youtube.com/watch?v=euqbMkM-QQk' ); media._getPreviewHtml(); expect( htmlSpy.calledOnce ).to.equal( true ); expect( htmlSpy.firstCall.args[ 0 ] ).to.deep.equal( [ 'youtube.com/watch?v=euqbMkM-QQk', 'euqbMkM-QQk' ] ); } ); } ); } );