2014-01-12 21:57:53 +04:00
/ * *
* ownCloud
*
* @ author Vincent Petry
* @ copyright 2014 Vincent Petry < pvince81 @ owncloud . com >
*
* This library is free software ; you can redistribute it and / or
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
* License as published by the Free Software Foundation ; either
* version 3 of the License , or any later version .
*
* This library is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU AFFERO GENERAL PUBLIC LICENSE for more details .
*
* You should have received a copy of the GNU Affero General Public
* License along with this library . If not , see < http : //www.gnu.org/licenses/>.
*
* /
2014-01-30 16:22:16 +04:00
2014-01-12 21:57:53 +04:00
describe ( 'Core base tests' , function ( ) {
2016-03-23 12:53:40 +03:00
afterEach ( function ( ) {
// many tests call window.initCore so need to unregister global events
// ideally in the future we'll need a window.unloadCore() function
$ ( document ) . off ( 'ajaxError.main' ) ;
$ ( document ) . off ( 'unload.main' ) ;
$ ( document ) . off ( 'beforeunload.main' ) ;
OC . _userIsNavigatingAway = false ;
OC . _reloadCalled = false ;
} ) ;
2014-01-12 21:57:53 +04:00
describe ( 'Base values' , function ( ) {
it ( 'Sets webroots' , function ( ) {
expect ( OC . webroot ) . toBeDefined ( ) ;
expect ( OC . appswebroots ) . toBeDefined ( ) ;
} ) ;
} ) ;
2014-01-30 16:22:16 +04:00
describe ( 'basename' , function ( ) {
it ( 'Returns the nothing if no file name given' , function ( ) {
expect ( OC . basename ( '' ) ) . toEqual ( '' ) ;
} ) ;
it ( 'Returns the nothing if dir is root' , function ( ) {
expect ( OC . basename ( '/' ) ) . toEqual ( '' ) ;
} ) ;
it ( 'Returns the same name if no path given' , function ( ) {
expect ( OC . basename ( 'some name.txt' ) ) . toEqual ( 'some name.txt' ) ;
} ) ;
it ( 'Returns the base name if root path given' , function ( ) {
expect ( OC . basename ( '/some name.txt' ) ) . toEqual ( 'some name.txt' ) ;
} ) ;
it ( 'Returns the base name if double root path given' , function ( ) {
expect ( OC . basename ( '//some name.txt' ) ) . toEqual ( 'some name.txt' ) ;
} ) ;
it ( 'Returns the base name if subdir given without root' , function ( ) {
expect ( OC . basename ( 'subdir/some name.txt' ) ) . toEqual ( 'some name.txt' ) ;
} ) ;
it ( 'Returns the base name if subdir given with root' , function ( ) {
expect ( OC . basename ( '/subdir/some name.txt' ) ) . toEqual ( 'some name.txt' ) ;
} ) ;
it ( 'Returns the base name if subdir given with double root' , function ( ) {
expect ( OC . basename ( '//subdir/some name.txt' ) ) . toEqual ( 'some name.txt' ) ;
} ) ;
it ( 'Returns the base name if subdir has dot' , function ( ) {
expect ( OC . basename ( '/subdir.dat/some name.txt' ) ) . toEqual ( 'some name.txt' ) ;
} ) ;
it ( 'Returns dot if file name is dot' , function ( ) {
expect ( OC . basename ( '/subdir/.' ) ) . toEqual ( '.' ) ;
} ) ;
// TODO: fix the source to make it work like PHP's basename
it ( 'Returns the dir itself if no file name given' , function ( ) {
// TODO: fix the source to make it work like PHP's dirname
// expect(OC.basename('subdir/')).toEqual('subdir');
expect ( OC . basename ( 'subdir/' ) ) . toEqual ( '' ) ;
} ) ;
it ( 'Returns the dir itself if no file name given with root' , function ( ) {
// TODO: fix the source to make it work like PHP's dirname
// expect(OC.basename('/subdir/')).toEqual('subdir');
expect ( OC . basename ( '/subdir/' ) ) . toEqual ( '' ) ;
} ) ;
} ) ;
describe ( 'dirname' , function ( ) {
it ( 'Returns the nothing if no file name given' , function ( ) {
expect ( OC . dirname ( '' ) ) . toEqual ( '' ) ;
} ) ;
it ( 'Returns the root if dir is root' , function ( ) {
// TODO: fix the source to make it work like PHP's dirname
// expect(OC.dirname('/')).toEqual('/');
expect ( OC . dirname ( '/' ) ) . toEqual ( '' ) ;
} ) ;
it ( 'Returns the root if dir is double root' , function ( ) {
// TODO: fix the source to make it work like PHP's dirname
// expect(OC.dirname('//')).toEqual('/');
expect ( OC . dirname ( '//' ) ) . toEqual ( '/' ) ; // oh no...
} ) ;
it ( 'Returns dot if dir is dot' , function ( ) {
expect ( OC . dirname ( '.' ) ) . toEqual ( '.' ) ;
} ) ;
it ( 'Returns dot if no root given' , function ( ) {
// TODO: fix the source to make it work like PHP's dirname
// expect(OC.dirname('some dir')).toEqual('.');
expect ( OC . dirname ( 'some dir' ) ) . toEqual ( 'some dir' ) ; // oh no...
} ) ;
it ( 'Returns the dir name if file name and root path given' , function ( ) {
// TODO: fix the source to make it work like PHP's dirname
// expect(OC.dirname('/some name.txt')).toEqual('/');
expect ( OC . dirname ( '/some name.txt' ) ) . toEqual ( '' ) ;
} ) ;
it ( 'Returns the dir name if double root path given' , function ( ) {
expect ( OC . dirname ( '//some name.txt' ) ) . toEqual ( '/' ) ; // how lucky...
} ) ;
it ( 'Returns the dir name if subdir given without root' , function ( ) {
expect ( OC . dirname ( 'subdir/some name.txt' ) ) . toEqual ( 'subdir' ) ;
} ) ;
it ( 'Returns the dir name if subdir given with root' , function ( ) {
expect ( OC . dirname ( '/subdir/some name.txt' ) ) . toEqual ( '/subdir' ) ;
} ) ;
it ( 'Returns the dir name if subdir given with double root' , function ( ) {
// TODO: fix the source to make it work like PHP's dirname
// expect(OC.dirname('//subdir/some name.txt')).toEqual('/subdir');
expect ( OC . dirname ( '//subdir/some name.txt' ) ) . toEqual ( '//subdir' ) ; // oh...
} ) ;
it ( 'Returns the dir name if subdir has dot' , function ( ) {
expect ( OC . dirname ( '/subdir.dat/some name.txt' ) ) . toEqual ( '/subdir.dat' ) ;
} ) ;
it ( 'Returns the dir name if file name is dot' , function ( ) {
expect ( OC . dirname ( '/subdir/.' ) ) . toEqual ( '/subdir' ) ;
} ) ;
it ( 'Returns the dir name if no file name given' , function ( ) {
expect ( OC . dirname ( 'subdir/' ) ) . toEqual ( 'subdir' ) ;
} ) ;
it ( 'Returns the dir name if no file name given with root' , function ( ) {
expect ( OC . dirname ( '/subdir/' ) ) . toEqual ( '/subdir' ) ;
} ) ;
} ) ;
2014-05-29 00:14:05 +04:00
describe ( 'escapeHTML' , function ( ) {
it ( 'Returns nothing if no string was given' , function ( ) {
expect ( escapeHTML ( '' ) ) . toEqual ( '' ) ;
} ) ;
it ( 'Returns a sanitized string if a string containing HTML is given' , function ( ) {
expect ( escapeHTML ( 'There needs to be a <script>alert(\"Unit\" + \'test\')</script> for it!' ) ) . toEqual ( 'There needs to be a <script>alert("Unit" + 'test')</script> for it!' ) ;
} ) ;
2014-05-31 23:11:29 +04:00
it ( 'Returns the string without modification if no potentially dangerous character is passed.' , function ( ) {
2014-05-29 00:14:05 +04:00
expect ( escapeHTML ( 'This is a good string without HTML.' ) ) . toEqual ( 'This is a good string without HTML.' ) ;
} ) ;
} ) ;
2015-07-10 14:01:01 +03:00
describe ( 'joinPaths' , function ( ) {
it ( 'returns empty string with no or empty arguments' , function ( ) {
expect ( OC . joinPaths ( ) ) . toEqual ( '' ) ;
expect ( OC . joinPaths ( '' ) ) . toEqual ( '' ) ;
expect ( OC . joinPaths ( '' , '' ) ) . toEqual ( '' ) ;
} ) ;
it ( 'returns joined path sections' , function ( ) {
expect ( OC . joinPaths ( 'abc' ) ) . toEqual ( 'abc' ) ;
expect ( OC . joinPaths ( 'abc' , 'def' ) ) . toEqual ( 'abc/def' ) ;
expect ( OC . joinPaths ( 'abc' , 'def' , 'ghi' ) ) . toEqual ( 'abc/def/ghi' ) ;
} ) ;
it ( 'keeps leading slashes' , function ( ) {
expect ( OC . joinPaths ( '/abc' ) ) . toEqual ( '/abc' ) ;
2015-07-13 11:57:52 +03:00
expect ( OC . joinPaths ( '/abc' , '' ) ) . toEqual ( '/abc' ) ;
expect ( OC . joinPaths ( '' , '/abc' ) ) . toEqual ( '/abc' ) ;
2015-07-10 14:01:01 +03:00
expect ( OC . joinPaths ( '/abc' , 'def' ) ) . toEqual ( '/abc/def' ) ;
expect ( OC . joinPaths ( '/abc' , 'def' , 'ghi' ) ) . toEqual ( '/abc/def/ghi' ) ;
} ) ;
it ( 'keeps trailing slashes' , function ( ) {
2015-07-13 11:57:52 +03:00
expect ( OC . joinPaths ( '' , 'abc/' ) ) . toEqual ( 'abc/' ) ;
2015-07-10 14:01:01 +03:00
expect ( OC . joinPaths ( 'abc/' ) ) . toEqual ( 'abc/' ) ;
2015-07-13 11:57:52 +03:00
expect ( OC . joinPaths ( 'abc/' , '' ) ) . toEqual ( 'abc/' ) ;
2015-07-10 14:01:01 +03:00
expect ( OC . joinPaths ( 'abc' , 'def/' ) ) . toEqual ( 'abc/def/' ) ;
expect ( OC . joinPaths ( 'abc' , 'def' , 'ghi/' ) ) . toEqual ( 'abc/def/ghi/' ) ;
} ) ;
it ( 'splits paths in specified strings and discards extra slashes' , function ( ) {
expect ( OC . joinPaths ( '//abc//' ) ) . toEqual ( '/abc/' ) ;
expect ( OC . joinPaths ( '//abc//def//' ) ) . toEqual ( '/abc/def/' ) ;
expect ( OC . joinPaths ( '//abc//' , '//def//' ) ) . toEqual ( '/abc/def/' ) ;
expect ( OC . joinPaths ( '//abc//' , '//def//' , '//ghi//' ) ) . toEqual ( '/abc/def/ghi/' ) ;
expect ( OC . joinPaths ( '//abc//def//' , '//ghi//jkl/mno/' , '//pqr//' ) )
. toEqual ( '/abc/def/ghi/jkl/mno/pqr/' ) ;
2015-07-10 16:31:58 +03:00
expect ( OC . joinPaths ( '/abc' , '/def' ) ) . toEqual ( '/abc/def' ) ;
expect ( OC . joinPaths ( '/abc/' , '/def' ) ) . toEqual ( '/abc/def' ) ;
expect ( OC . joinPaths ( '/abc/' , 'def' ) ) . toEqual ( '/abc/def' ) ;
2015-07-10 14:01:01 +03:00
} ) ;
it ( 'discards empty sections' , function ( ) {
expect ( OC . joinPaths ( 'abc' , '' , 'def' ) ) . toEqual ( 'abc/def' ) ;
} ) ;
it ( 'returns root if only slashes' , function ( ) {
expect ( OC . joinPaths ( '//' ) ) . toEqual ( '/' ) ;
expect ( OC . joinPaths ( '/' , '/' ) ) . toEqual ( '/' ) ;
expect ( OC . joinPaths ( '/' , '//' , '/' ) ) . toEqual ( '/' ) ;
} ) ;
} ) ;
2015-12-21 15:10:03 +03:00
describe ( 'isSamePath' , function ( ) {
it ( 'recognizes empty paths are equal' , function ( ) {
expect ( OC . isSamePath ( '' , '' ) ) . toEqual ( true ) ;
expect ( OC . isSamePath ( '/' , '' ) ) . toEqual ( true ) ;
expect ( OC . isSamePath ( '//' , '' ) ) . toEqual ( true ) ;
expect ( OC . isSamePath ( '/' , '/' ) ) . toEqual ( true ) ;
expect ( OC . isSamePath ( '/' , '//' ) ) . toEqual ( true ) ;
} ) ;
it ( 'recognizes path with single sections as equal regardless of extra slashes' , function ( ) {
expect ( OC . isSamePath ( 'abc' , 'abc' ) ) . toEqual ( true ) ;
expect ( OC . isSamePath ( '/abc' , 'abc' ) ) . toEqual ( true ) ;
expect ( OC . isSamePath ( '//abc' , 'abc' ) ) . toEqual ( true ) ;
expect ( OC . isSamePath ( 'abc' , '/abc' ) ) . toEqual ( true ) ;
expect ( OC . isSamePath ( 'abc/' , 'abc' ) ) . toEqual ( true ) ;
expect ( OC . isSamePath ( 'abc/' , 'abc/' ) ) . toEqual ( true ) ;
expect ( OC . isSamePath ( '/abc/' , 'abc/' ) ) . toEqual ( true ) ;
expect ( OC . isSamePath ( '/abc/' , '/abc/' ) ) . toEqual ( true ) ;
expect ( OC . isSamePath ( '//abc/' , '/abc/' ) ) . toEqual ( true ) ;
expect ( OC . isSamePath ( '//abc//' , '/abc/' ) ) . toEqual ( true ) ;
expect ( OC . isSamePath ( 'abc' , 'def' ) ) . toEqual ( false ) ;
expect ( OC . isSamePath ( '/abc' , 'def' ) ) . toEqual ( false ) ;
expect ( OC . isSamePath ( '//abc' , 'def' ) ) . toEqual ( false ) ;
expect ( OC . isSamePath ( 'abc' , '/def' ) ) . toEqual ( false ) ;
expect ( OC . isSamePath ( 'abc/' , 'def' ) ) . toEqual ( false ) ;
expect ( OC . isSamePath ( 'abc/' , 'def/' ) ) . toEqual ( false ) ;
expect ( OC . isSamePath ( '/abc/' , 'def/' ) ) . toEqual ( false ) ;
expect ( OC . isSamePath ( '/abc/' , '/def/' ) ) . toEqual ( false ) ;
expect ( OC . isSamePath ( '//abc/' , '/def/' ) ) . toEqual ( false ) ;
expect ( OC . isSamePath ( '//abc//' , '/def/' ) ) . toEqual ( false ) ;
} ) ;
it ( 'recognizes path with multiple sections as equal regardless of extra slashes' , function ( ) {
expect ( OC . isSamePath ( 'abc/def' , 'abc/def' ) ) . toEqual ( true ) ;
expect ( OC . isSamePath ( '/abc/def' , 'abc/def' ) ) . toEqual ( true ) ;
expect ( OC . isSamePath ( 'abc/def' , '/abc/def' ) ) . toEqual ( true ) ;
expect ( OC . isSamePath ( 'abc/def/' , '/abc/def/' ) ) . toEqual ( true ) ;
expect ( OC . isSamePath ( '/abc/def/' , '/abc/def/' ) ) . toEqual ( true ) ;
expect ( OC . isSamePath ( '/abc/def/' , 'abc/def/' ) ) . toEqual ( true ) ;
expect ( OC . isSamePath ( '//abc/def/' , 'abc/def/' ) ) . toEqual ( true ) ;
expect ( OC . isSamePath ( '//abc/def//' , 'abc/def/' ) ) . toEqual ( true ) ;
expect ( OC . isSamePath ( 'abc/def' , 'abc/ghi' ) ) . toEqual ( false ) ;
expect ( OC . isSamePath ( '/abc/def' , 'abc/ghi' ) ) . toEqual ( false ) ;
expect ( OC . isSamePath ( 'abc/def' , '/abc/ghi' ) ) . toEqual ( false ) ;
expect ( OC . isSamePath ( 'abc/def/' , '/abc/ghi/' ) ) . toEqual ( false ) ;
expect ( OC . isSamePath ( '/abc/def/' , '/abc/ghi/' ) ) . toEqual ( false ) ;
expect ( OC . isSamePath ( '/abc/def/' , 'abc/ghi/' ) ) . toEqual ( false ) ;
expect ( OC . isSamePath ( '//abc/def/' , 'abc/ghi/' ) ) . toEqual ( false ) ;
expect ( OC . isSamePath ( '//abc/def//' , 'abc/ghi/' ) ) . toEqual ( false ) ;
} ) ;
it ( 'recognizes path entries with dot' , function ( ) {
expect ( OC . isSamePath ( '.' , '' ) ) . toEqual ( true ) ;
expect ( OC . isSamePath ( '.' , '.' ) ) . toEqual ( true ) ;
expect ( OC . isSamePath ( '.' , '/' ) ) . toEqual ( true ) ;
expect ( OC . isSamePath ( '/.' , '/' ) ) . toEqual ( true ) ;
expect ( OC . isSamePath ( '/./' , '/' ) ) . toEqual ( true ) ;
expect ( OC . isSamePath ( '/./' , '/.' ) ) . toEqual ( true ) ;
expect ( OC . isSamePath ( '/./' , '/./' ) ) . toEqual ( true ) ;
expect ( OC . isSamePath ( '/./' , '/./' ) ) . toEqual ( true ) ;
expect ( OC . isSamePath ( 'a/./b' , 'a/b' ) ) . toEqual ( true ) ;
expect ( OC . isSamePath ( 'a/b/.' , 'a/b' ) ) . toEqual ( true ) ;
expect ( OC . isSamePath ( './a/b' , 'a/b' ) ) . toEqual ( true ) ;
} ) ;
} ) ;
2014-09-09 14:05:19 +04:00
describe ( 'filePath' , function ( ) {
2014-09-09 15:08:50 +04:00
beforeEach ( function ( ) {
2014-09-09 14:05:19 +04:00
OC . webroot = 'http://localhost' ;
2017-11-06 11:57:59 +03:00
OC . appswebroots . files = OC . webroot + '/apps3/files' ;
2014-09-09 15:08:50 +04:00
} ) ;
afterEach ( function ( ) {
2017-11-06 11:57:59 +03:00
delete OC . appswebroots . files ;
2014-09-09 15:08:50 +04:00
} ) ;
2014-09-09 14:05:19 +04:00
2014-09-09 15:08:50 +04:00
it ( 'Uses a direct link for css and images,' , function ( ) {
2014-09-09 14:05:19 +04:00
expect ( OC . filePath ( 'core' , 'css' , 'style.css' ) ) . toEqual ( 'http://localhost/core/css/style.css' ) ;
expect ( OC . filePath ( 'files' , 'css' , 'style.css' ) ) . toEqual ( 'http://localhost/apps3/files/css/style.css' ) ;
expect ( OC . filePath ( 'core' , 'img' , 'image.png' ) ) . toEqual ( 'http://localhost/core/img/image.png' ) ;
expect ( OC . filePath ( 'files' , 'img' , 'image.png' ) ) . toEqual ( 'http://localhost/apps3/files/img/image.png' ) ;
} ) ;
it ( 'Routes PHP files via index.php,' , function ( ) {
expect ( OC . filePath ( 'core' , 'ajax' , 'test.php' ) ) . toEqual ( 'http://localhost/index.php/core/ajax/test.php' ) ;
expect ( OC . filePath ( 'files' , 'ajax' , 'test.php' ) ) . toEqual ( 'http://localhost/index.php/apps/files/ajax/test.php' ) ;
} ) ;
} ) ;
2014-01-12 21:57:53 +04:00
describe ( 'Link functions' , function ( ) {
var TESTAPP = 'testapp' ;
var TESTAPP _ROOT = OC . webroot + '/appsx/testapp' ;
beforeEach ( function ( ) {
OC . appswebroots [ TESTAPP ] = TESTAPP _ROOT ;
} ) ;
afterEach ( function ( ) {
// restore original array
delete OC . appswebroots [ TESTAPP ] ;
} ) ;
it ( 'Generates correct links for core apps' , function ( ) {
expect ( OC . linkTo ( 'core' , 'somefile.php' ) ) . toEqual ( OC . webroot + '/core/somefile.php' ) ;
expect ( OC . linkTo ( 'admin' , 'somefile.php' ) ) . toEqual ( OC . webroot + '/admin/somefile.php' ) ;
} ) ;
it ( 'Generates correct links for regular apps' , function ( ) {
expect ( OC . linkTo ( TESTAPP , 'somefile.php' ) ) . toEqual ( OC . webroot + '/index.php/apps/' + TESTAPP + '/somefile.php' ) ;
} ) ;
it ( 'Generates correct remote links' , function ( ) {
expect ( OC . linkToRemote ( 'webdav' ) ) . toEqual ( window . location . protocol + '//' + window . location . host + OC . webroot + '/remote.php/webdav' ) ;
} ) ;
describe ( 'Images' , function ( ) {
it ( 'Generates image path with given extension' , function ( ) {
expect ( OC . imagePath ( 'core' , 'somefile.jpg' ) ) . toEqual ( OC . webroot + '/core/img/somefile.jpg' ) ;
expect ( OC . imagePath ( TESTAPP , 'somefile.jpg' ) ) . toEqual ( TESTAPP _ROOT + '/img/somefile.jpg' ) ;
} ) ;
2016-06-29 16:14:34 +03:00
it ( 'Generates image path with svg extension' , function ( ) {
2014-01-12 21:57:53 +04:00
expect ( OC . imagePath ( 'core' , 'somefile' ) ) . toEqual ( OC . webroot + '/core/img/somefile.svg' ) ;
expect ( OC . imagePath ( TESTAPP , 'somefile' ) ) . toEqual ( TESTAPP _ROOT + '/img/somefile.svg' ) ;
} ) ;
} ) ;
} ) ;
2014-01-24 15:44:31 +04:00
describe ( 'Query string building' , function ( ) {
it ( 'Returns empty string when empty params' , function ( ) {
expect ( OC . buildQueryString ( ) ) . toEqual ( '' ) ;
expect ( OC . buildQueryString ( { } ) ) . toEqual ( '' ) ;
} ) ;
it ( 'Encodes regular query strings' , function ( ) {
expect ( OC . buildQueryString ( {
a : 'abc' ,
b : 'def'
} ) ) . toEqual ( 'a=abc&b=def' ) ;
} ) ;
it ( 'Encodes special characters' , function ( ) {
expect ( OC . buildQueryString ( {
2014-03-05 04:10:39 +04:00
unicode : '汉字'
2014-01-24 15:44:31 +04:00
} ) ) . toEqual ( 'unicode=%E6%B1%89%E5%AD%97' ) ;
expect ( OC . buildQueryString ( {
2014-03-01 05:46:27 +04:00
b : 'spaace value' ,
'space key' : 'normalvalue' ,
'slash/this' : 'amp&ersand'
2014-01-24 15:44:31 +04:00
} ) ) . toEqual ( 'b=spaace%20value&space%20key=normalvalue&slash%2Fthis=amp%26ersand' ) ;
} ) ;
it ( 'Encodes data types and empty values' , function ( ) {
expect ( OC . buildQueryString ( {
'keywithemptystring' : '' ,
2014-03-01 05:46:27 +04:00
'keywithnull' : null ,
'keywithundefined' : null ,
2014-01-24 15:44:31 +04:00
something : 'else'
} ) ) . toEqual ( 'keywithemptystring=&keywithnull&keywithundefined&something=else' ) ;
expect ( OC . buildQueryString ( {
2014-03-01 05:46:27 +04:00
'booleanfalse' : false ,
2014-01-24 15:44:31 +04:00
'booleantrue' : true
} ) ) . toEqual ( 'booleanfalse=false&booleantrue=true' ) ;
expect ( OC . buildQueryString ( {
2014-03-01 05:46:27 +04:00
'number' : 123
2014-01-24 15:44:31 +04:00
} ) ) . toEqual ( 'number=123' ) ;
} ) ;
} ) ;
2014-02-04 16:56:41 +04:00
describe ( 'Session heartbeat' , function ( ) {
var clock ,
oldConfig ,
routeStub ,
counter ;
beforeEach ( function ( ) {
clock = sinon . useFakeTimers ( ) ;
oldConfig = window . oc _config ;
2014-03-05 04:10:39 +04:00
routeStub = sinon . stub ( OC , 'generateUrl' ) . returns ( '/heartbeat' ) ;
2014-02-04 16:56:41 +04:00
counter = 0 ;
fakeServer . autoRespond = true ;
fakeServer . autoRespondAfter = 0 ;
fakeServer . respondWith ( /\/heartbeat/ , function ( xhr ) {
counter ++ ;
xhr . respond ( 200 , { 'Content-Type' : 'application/json' } , '{}' ) ;
} ) ;
2016-04-14 12:12:15 +03:00
$ ( document ) . off ( 'ajaxComplete' ) ; // ignore previously registered heartbeats
2014-02-04 16:56:41 +04:00
} ) ;
afterEach ( function ( ) {
clock . restore ( ) ;
2014-06-12 20:42:09 +04:00
/* jshint camelcase: false */
2014-02-04 16:56:41 +04:00
window . oc _config = oldConfig ;
routeStub . restore ( ) ;
2015-12-10 20:08:40 +03:00
$ ( document ) . off ( 'ajaxError' ) ;
2016-04-14 12:12:15 +03:00
$ ( document ) . off ( 'ajaxComplete' ) ;
2014-02-04 16:56:41 +04:00
} ) ;
it ( 'sends heartbeat half the session lifetime when heartbeat enabled' , function ( ) {
2014-06-12 20:42:09 +04:00
/* jshint camelcase: false */
2014-02-04 16:56:41 +04:00
window . oc _config = {
session _keepalive : true ,
session _lifetime : 300
} ;
window . initCore ( ) ;
2014-03-05 04:10:39 +04:00
expect ( routeStub . calledWith ( '/heartbeat' ) ) . toEqual ( true ) ;
2014-02-04 16:56:41 +04:00
expect ( counter ) . toEqual ( 0 ) ;
// less than half, still nothing
clock . tick ( 100 * 1000 ) ;
expect ( counter ) . toEqual ( 0 ) ;
// reach past half (160), one call
clock . tick ( 55 * 1000 ) ;
expect ( counter ) . toEqual ( 1 ) ;
// almost there to the next, still one
clock . tick ( 140 * 1000 ) ;
expect ( counter ) . toEqual ( 1 ) ;
// past it, second call
clock . tick ( 20 * 1000 ) ;
expect ( counter ) . toEqual ( 2 ) ;
} ) ;
2016-04-14 12:12:15 +03:00
it ( 'does not send heartbeat when heartbeat disabled' , function ( ) {
2014-06-12 20:42:09 +04:00
/* jshint camelcase: false */
2014-02-04 16:56:41 +04:00
window . oc _config = {
session _keepalive : false ,
session _lifetime : 300
} ;
window . initCore ( ) ;
expect ( routeStub . notCalled ) . toEqual ( true ) ;
expect ( counter ) . toEqual ( 0 ) ;
clock . tick ( 1000000 ) ;
// still nothing
expect ( counter ) . toEqual ( 0 ) ;
} ) ;
2014-06-12 20:42:09 +04:00
it ( 'limits the heartbeat between one minute and one day' , function ( ) {
/* jshint camelcase: false */
var setIntervalStub = sinon . stub ( window , 'setInterval' ) ;
window . oc _config = {
session _keepalive : true ,
session _lifetime : 5
} ;
window . initCore ( ) ;
expect ( setIntervalStub . getCall ( 0 ) . args [ 1 ] ) . toEqual ( 60 * 1000 ) ;
setIntervalStub . reset ( ) ;
window . oc _config = {
session _keepalive : true ,
session _lifetime : 48 * 3600
} ;
window . initCore ( ) ;
expect ( setIntervalStub . getCall ( 0 ) . args [ 1 ] ) . toEqual ( 24 * 3600 * 1000 ) ;
setIntervalStub . restore ( ) ;
} ) ;
2014-01-28 19:16:09 +04:00
} ) ;
describe ( 'Parse query string' , function ( ) {
it ( 'Parses query string from full URL' , function ( ) {
var query = OC . parseQueryString ( 'http://localhost/stuff.php?q=a&b=x' ) ;
expect ( query ) . toEqual ( { q : 'a' , b : 'x' } ) ;
} ) ;
it ( 'Parses query string from query part alone' , function ( ) {
var query = OC . parseQueryString ( 'q=a&b=x' ) ;
expect ( query ) . toEqual ( { q : 'a' , b : 'x' } ) ;
} ) ;
it ( 'Returns null hash when empty query' , function ( ) {
var query = OC . parseQueryString ( '' ) ;
expect ( query ) . toEqual ( null ) ;
} ) ;
it ( 'Returns empty hash when empty query with question mark' , function ( ) {
var query = OC . parseQueryString ( '?' ) ;
expect ( query ) . toEqual ( { } ) ;
} ) ;
it ( 'Decodes regular query strings' , function ( ) {
var query = OC . parseQueryString ( 'a=abc&b=def' ) ;
expect ( query ) . toEqual ( {
a : 'abc' ,
b : 'def'
} ) ;
} ) ;
it ( 'Ignores empty parts' , function ( ) {
var query = OC . parseQueryString ( '&q=a&&b=x&' ) ;
expect ( query ) . toEqual ( { q : 'a' , b : 'x' } ) ;
} ) ;
it ( 'Ignores lone equal signs' , function ( ) {
var query = OC . parseQueryString ( '&q=a&=&b=x&' ) ;
expect ( query ) . toEqual ( { q : 'a' , b : 'x' } ) ;
} ) ;
it ( 'Includes extra equal signs in value' , function ( ) {
var query = OC . parseQueryString ( 'u=a=x&q=a=b' ) ;
expect ( query ) . toEqual ( { u : 'a=x' , q : 'a=b' } ) ;
} ) ;
it ( 'Decodes plus as space' , function ( ) {
var query = OC . parseQueryString ( 'space+key=space+value' ) ;
expect ( query ) . toEqual ( { 'space key' : 'space value' } ) ;
} ) ;
it ( 'Decodes special characters' , function ( ) {
var query = OC . parseQueryString ( 'unicode=%E6%B1%89%E5%AD%97' ) ;
expect ( query ) . toEqual ( { unicode : '汉字' } ) ;
query = OC . parseQueryString ( 'b=spaace%20value&space%20key=normalvalue&slash%2Fthis=amp%26ersand' ) ;
expect ( query ) . toEqual ( {
b : 'spaace value' ,
'space key' : 'normalvalue' ,
'slash/this' : 'amp&ersand'
} ) ;
} ) ;
it ( 'Decodes empty values' , function ( ) {
var query = OC . parseQueryString ( 'keywithemptystring=&keywithnostring' ) ;
expect ( query ) . toEqual ( {
'keywithemptystring' : '' ,
'keywithnostring' : null
} ) ;
} ) ;
it ( 'Does not interpret data types' , function ( ) {
var query = OC . parseQueryString ( 'booleanfalse=false&booleantrue=true&number=123' ) ;
expect ( query ) . toEqual ( {
'booleanfalse' : 'false' ,
'booleantrue' : 'true' ,
'number' : '123'
} ) ;
} ) ;
2014-02-04 16:56:41 +04:00
} ) ;
2014-03-06 03:26:57 +04:00
describe ( 'Generate Url' , function ( ) {
it ( 'returns absolute urls' , function ( ) {
expect ( OC . generateUrl ( 'heartbeat' ) ) . toEqual ( OC . webroot + '/index.php/heartbeat' ) ;
expect ( OC . generateUrl ( '/heartbeat' ) ) . toEqual ( OC . webroot + '/index.php/heartbeat' ) ;
} ) ;
2015-02-16 22:07:45 +03:00
it ( 'substitutes parameters which are escaped by default' , function ( ) {
expect ( OC . generateUrl ( 'apps/files/download/{file}' , { file : '<">ImAnUnescapedString/!' } ) ) . toEqual ( OC . webroot + '/index.php/apps/files/download/%3C%22%3EImAnUnescapedString%2F!' ) ;
} ) ;
it ( 'substitutes parameters which can also be unescaped via option flag' , function ( ) {
expect ( OC . generateUrl ( 'apps/files/download/{file}' , { file : 'subfolder/Welcome.txt' } , { escape : false } ) ) . toEqual ( OC . webroot + '/index.php/apps/files/download/subfolder/Welcome.txt' ) ;
} ) ;
it ( 'substitutes multiple parameters which are escaped by default' , function ( ) {
expect ( OC . generateUrl ( 'apps/files/download/{file}/{id}' , { file : '<">ImAnUnescapedString/!' , id : 5 } ) ) . toEqual ( OC . webroot + '/index.php/apps/files/download/%3C%22%3EImAnUnescapedString%2F!/5' ) ;
} ) ;
it ( 'substitutes multiple parameters which can also be unescaped via option flag' , function ( ) {
expect ( OC . generateUrl ( 'apps/files/download/{file}/{id}' , { file : 'subfolder/Welcome.txt' , id : 5 } , { escape : false } ) ) . toEqual ( OC . webroot + '/index.php/apps/files/download/subfolder/Welcome.txt/5' ) ;
2014-03-06 03:26:57 +04:00
} ) ;
2014-08-26 17:40:56 +04:00
it ( 'doesnt error out with no params provided' , function ( ) {
2015-02-16 22:07:45 +03:00
expect ( OC . generateUrl ( 'apps/files/download{file}' ) ) . toEqual ( OC . webroot + '/index.php/apps/files/download%7Bfile%7D' ) ;
2014-08-26 17:40:56 +04:00
} ) ;
2014-03-06 03:26:57 +04:00
} ) ;
2014-03-18 16:09:25 +04:00
describe ( 'Main menu mobile toggle' , function ( ) {
2014-05-17 20:03:00 +04:00
var clock ;
2014-03-18 16:09:25 +04:00
var $toggle ;
var $navigation ;
beforeEach ( function ( ) {
2016-04-18 11:41:02 +03:00
jQuery . fx . off = true ;
2014-06-02 20:09:26 +04:00
clock = sinon . useFakeTimers ( ) ;
2014-03-18 16:09:25 +04:00
$ ( '#testArea' ) . append ( '<div id="header">' +
2015-11-02 11:49:03 +03:00
'<a class="menutoggle header-appname-container" href="#">' +
2015-03-26 19:10:59 +03:00
'<h1 class="header-appname"></h1>' +
'<div class="icon-caret"></div>' +
'</a>' +
2014-03-18 16:09:25 +04:00
'</div>' +
'<div id="navigation"></div>' ) ;
2014-06-05 02:40:15 +04:00
$toggle = $ ( '#header' ) . find ( '.menutoggle' ) ;
2014-03-18 16:09:25 +04:00
$navigation = $ ( '#navigation' ) ;
} ) ;
afterEach ( function ( ) {
2016-04-18 11:41:02 +03:00
jQuery . fx . off = false ;
2014-06-02 20:09:26 +04:00
clock . restore ( ) ;
2015-12-10 20:08:40 +03:00
$ ( document ) . off ( 'ajaxError' ) ;
2014-03-18 16:09:25 +04:00
} ) ;
2014-05-17 20:03:00 +04:00
it ( 'Sets up menu toggle' , function ( ) {
2014-03-18 16:09:25 +04:00
window . initCore ( ) ;
expect ( $navigation . hasClass ( 'menu' ) ) . toEqual ( true ) ;
} ) ;
2014-05-17 20:03:00 +04:00
it ( 'Clicking menu toggle toggles navigation in' , function ( ) {
2014-03-18 16:09:25 +04:00
window . initCore ( ) ;
expect ( $navigation . is ( ':visible' ) ) . toEqual ( false ) ;
$toggle . click ( ) ;
2014-06-02 20:09:26 +04:00
clock . tick ( 1 * 1000 ) ;
2014-03-18 16:09:25 +04:00
expect ( $navigation . is ( ':visible' ) ) . toEqual ( true ) ;
$toggle . click ( ) ;
2014-06-02 20:09:26 +04:00
clock . tick ( 1 * 1000 ) ;
2014-03-18 16:09:25 +04:00
expect ( $navigation . is ( ':visible' ) ) . toEqual ( false ) ;
} ) ;
} ) ;
2014-02-11 19:52:56 +04:00
describe ( 'Util' , function ( ) {
describe ( 'humanFileSize' , function ( ) {
it ( 'renders file sizes with the correct unit' , function ( ) {
var data = [
[ 0 , '0 B' ] ,
2015-01-29 19:27:28 +03:00
[ "0" , '0 B' ] ,
[ "A" , 'NaN B' ] ,
2014-02-11 19:52:56 +04:00
[ 125 , '125 B' ] ,
2016-01-19 12:51:57 +03:00
[ 128000 , '125 KB' ] ,
2014-02-11 19:52:56 +04:00
[ 128000000 , '122.1 MB' ] ,
[ 128000000000 , '119.2 GB' ] ,
[ 128000000000000 , '116.4 TB' ]
] ;
for ( var i = 0 ; i < data . length ; i ++ ) {
expect ( OC . Util . humanFileSize ( data [ i ] [ 0 ] ) ) . toEqual ( data [ i ] [ 1 ] ) ;
}
} ) ;
2014-06-02 12:38:46 +04:00
it ( 'renders file sizes with the correct unit for small sizes' , function ( ) {
var data = [
2016-01-19 12:51:57 +03:00
[ 0 , '0 KB' ] ,
[ 125 , '< 1 KB' ] ,
[ 128000 , '125 KB' ] ,
2014-06-02 12:38:46 +04:00
[ 128000000 , '122.1 MB' ] ,
[ 128000000000 , '119.2 GB' ] ,
[ 128000000000000 , '116.4 TB' ]
] ;
for ( var i = 0 ; i < data . length ; i ++ ) {
expect ( OC . Util . humanFileSize ( data [ i ] [ 0 ] , true ) ) . toEqual ( data [ i ] [ 1 ] ) ;
}
} ) ;
2014-02-11 19:52:56 +04:00
} ) ;
2016-12-07 12:38:54 +03:00
describe ( 'computerFileSize' , function ( ) {
it ( 'correctly parses file sizes from a human readable formated string' , function ( ) {
var data = [
2016-12-07 13:43:44 +03:00
[ '125' , 125 ] ,
2017-02-27 09:49:15 +03:00
[ '125.25' , 125 ] ,
[ '125.25B' , 125 ] ,
[ '125.25 B' , 125 ] ,
2016-12-07 12:38:54 +03:00
[ '0 B' , 0 ] ,
2017-02-27 09:49:15 +03:00
[ '99999999999999999999999999999999999999999999 B' , 99999999999999999999999999999999999999999999 ] ,
[ '0 MB' , 0 ] ,
[ '0 kB' , 0 ] ,
[ '0kB' , 0 ] ,
2016-12-07 12:38:54 +03:00
[ '125 B' , 125 ] ,
[ '125b' , 125 ] ,
[ '125 KB' , 128000 ] ,
[ '125kb' , 128000 ] ,
2016-12-07 13:03:15 +03:00
[ '122.1 MB' , 128031130 ] ,
[ '122.1mb' , 128031130 ] ,
2016-12-07 12:38:54 +03:00
[ '119.2 GB' , 127990025421 ] ,
[ '119.2gb' , 127990025421 ] ,
[ '116.4 TB' , 127983153473126 ] ,
2017-02-27 09:49:15 +03:00
[ '116.4tb' , 127983153473126 ] ,
[ '8776656778888777655.4tb' , 9.650036181387265 e + 30 ] ,
[ 1234 , null ] ,
[ - 1234 , null ] ,
[ '-1234 B' , null ] ,
[ 'B' , null ] ,
[ '40/0' , null ] ,
[ '40,30 kb' , null ] ,
2017-02-28 05:40:34 +03:00
[ ' 122.1 MB ' , 128031130 ] ,
[ '122.1 MB ' , 128031130 ] ,
[ ' 122.1 MB ' , 128031130 ] ,
[ ' 122.1 MB ' , 128031130 ] ,
[ '122.1 MB ' , 128031130 ] ,
[ ' 125' , 125 ] ,
[ ' 125 ' , 125 ] ,
2016-12-07 12:38:54 +03:00
] ;
for ( var i = 0 ; i < data . length ; i ++ ) {
expect ( OC . Util . computerFileSize ( data [ i ] [ 0 ] ) ) . toEqual ( data [ i ] [ 1 ] ) ;
}
} ) ;
2016-12-07 13:43:44 +03:00
it ( 'returns null if the parameter is not a string' , function ( ) {
expect ( OC . Util . computerFileSize ( NaN ) ) . toEqual ( null ) ;
expect ( OC . Util . computerFileSize ( 125 ) ) . toEqual ( null ) ;
} ) ;
it ( 'returns null if the string is unparsable' , function ( ) {
expect ( OC . Util . computerFileSize ( '' ) ) . toEqual ( null ) ;
expect ( OC . Util . computerFileSize ( 'foobar' ) ) . toEqual ( null ) ;
} ) ;
2016-12-07 12:38:54 +03:00
} ) ;
2014-07-14 18:05:46 +04:00
describe ( 'stripTime' , function ( ) {
it ( 'strips time from dates' , function ( ) {
expect ( OC . Util . stripTime ( new Date ( 2014 , 2 , 24 , 15 , 4 , 45 , 24 ) ) )
. toEqual ( new Date ( 2014 , 2 , 24 , 0 , 0 , 0 , 0 ) ) ;
} ) ;
} ) ;
2014-02-11 19:52:56 +04:00
} ) ;
2014-02-18 15:29:05 +04:00
describe ( 'naturalSortCompare' , function ( ) {
// cit() will skip tests if running on PhantomJS because it has issues with
// localeCompare(). See https://github.com/ariya/phantomjs/issues/11063
//
// Please make sure to run these tests in Chrome/Firefox manually
// to make sure they run.
var cit = window . isPhantom ? xit : it ;
// must provide the same results as \OC_Util::naturalSortCompare
it ( 'sorts alphabetically' , function ( ) {
var a = [
'def' ,
'xyz' ,
'abc'
] ;
a . sort ( OC . Util . naturalSortCompare ) ;
expect ( a ) . toEqual ( [
'abc' ,
'def' ,
'xyz'
] ) ;
} ) ;
cit ( 'sorts with different casing' , function ( ) {
var a = [
'aaa' ,
'bbb' ,
'BBB' ,
'AAA'
] ;
a . sort ( OC . Util . naturalSortCompare ) ;
expect ( a ) . toEqual ( [
'aaa' ,
'AAA' ,
'bbb' ,
'BBB'
] ) ;
} ) ;
it ( 'sorts with numbers' , function ( ) {
var a = [
'124.txt' ,
'abc1' ,
'123.txt' ,
'abc' ,
'abc2' ,
'def (2).txt' ,
'ghi 10.txt' ,
'abc12' ,
'def.txt' ,
'def (1).txt' ,
'ghi 2.txt' ,
'def (10).txt' ,
'abc10' ,
'def (12).txt' ,
'z' ,
'ghi.txt' ,
'za' ,
'ghi 1.txt' ,
'ghi 12.txt' ,
2014-07-23 14:52:13 +04:00
'zz' ,
'15.txt' ,
'15b.txt'
2014-02-18 15:29:05 +04:00
] ;
a . sort ( OC . Util . naturalSortCompare ) ;
expect ( a ) . toEqual ( [
2014-07-23 14:52:13 +04:00
'15.txt' ,
'15b.txt' ,
2014-02-18 15:29:05 +04:00
'123.txt' ,
'124.txt' ,
'abc' ,
'abc1' ,
'abc2' ,
'abc10' ,
'abc12' ,
'def.txt' ,
'def (1).txt' ,
'def (2).txt' ,
'def (10).txt' ,
'def (12).txt' ,
'ghi.txt' ,
'ghi 1.txt' ,
'ghi 2.txt' ,
'ghi 10.txt' ,
'ghi 12.txt' ,
'z' ,
'za' ,
'zz'
] ) ;
} ) ;
it ( 'sorts with chinese characters' , function ( ) {
var a = [
'十.txt' ,
'一.txt' ,
'二.txt' ,
'十 2.txt' ,
'三.txt' ,
'四.txt' ,
'abc.txt' ,
'五.txt' ,
'七.txt' ,
'八.txt' ,
'九.txt' ,
'六.txt' ,
'十一.txt' ,
'波.txt' ,
'破.txt' ,
'莫.txt' ,
'啊.txt' ,
'123.txt'
] ;
a . sort ( OC . Util . naturalSortCompare ) ;
expect ( a ) . toEqual ( [
'123.txt' ,
'abc.txt' ,
'一.txt' ,
'七.txt' ,
'三.txt' ,
'九.txt' ,
'二.txt' ,
'五.txt' ,
'八.txt' ,
'六.txt' ,
'十.txt' ,
'十 2.txt' ,
'十一.txt' ,
'啊.txt' ,
'四.txt' ,
'波.txt' ,
'破.txt' ,
'莫.txt'
] ) ;
} ) ;
cit ( 'sorts with umlauts' , function ( ) {
var a = [
'öh.txt' ,
'Äh.txt' ,
'oh.txt' ,
'Üh 2.txt' ,
'Üh.txt' ,
'ah.txt' ,
'Öh.txt' ,
'uh.txt' ,
'üh.txt' ,
'äh.txt'
] ;
a . sort ( OC . Util . naturalSortCompare ) ;
expect ( a ) . toEqual ( [
'ah.txt' ,
'äh.txt' ,
'Äh.txt' ,
'oh.txt' ,
'öh.txt' ,
'Öh.txt' ,
'uh.txt' ,
'üh.txt' ,
'Üh.txt' ,
'Üh 2.txt'
] ) ;
} ) ;
} ) ;
2014-12-01 18:17:28 +03:00
describe ( 'Plugins' , function ( ) {
var plugin ;
beforeEach ( function ( ) {
plugin = {
name : 'Some name' ,
attach : function ( obj ) {
obj . attached = true ;
} ,
detach : function ( obj ) {
obj . attached = false ;
}
} ;
OC . Plugins . register ( 'OC.Test.SomeName' , plugin ) ;
} ) ;
it ( 'attach plugin to object' , function ( ) {
var obj = { something : true } ;
OC . Plugins . attach ( 'OC.Test.SomeName' , obj ) ;
expect ( obj . attached ) . toEqual ( true ) ;
OC . Plugins . detach ( 'OC.Test.SomeName' , obj ) ;
expect ( obj . attached ) . toEqual ( false ) ;
} ) ;
it ( 'only call handler for target name' , function ( ) {
var obj = { something : true } ;
OC . Plugins . attach ( 'OC.Test.SomeOtherName' , obj ) ;
expect ( obj . attached ) . not . toBeDefined ( ) ;
OC . Plugins . detach ( 'OC.Test.SomeOtherName' , obj ) ;
expect ( obj . attached ) . not . toBeDefined ( ) ;
} ) ;
} ) ;
2015-01-07 16:51:20 +03:00
describe ( 'Notifications' , function ( ) {
2016-02-19 14:09:46 +03:00
var showSpy ;
var showHtmlSpy ;
var hideSpy ;
var clock ;
beforeEach ( function ( ) {
clock = sinon . useFakeTimers ( ) ;
showSpy = sinon . spy ( OC . Notification , 'show' ) ;
showHtmlSpy = sinon . spy ( OC . Notification , 'showHtml' ) ;
hideSpy = sinon . spy ( OC . Notification , 'hide' ) ;
$ ( '#testArea' ) . append ( '<div id="notification"></div>' ) ;
2015-01-07 16:51:20 +03:00
} ) ;
2016-02-19 14:09:46 +03:00
afterEach ( function ( ) {
showSpy . restore ( ) ;
showHtmlSpy . restore ( ) ;
hideSpy . restore ( ) ;
// jump past animations
clock . tick ( 10000 ) ;
clock . restore ( ) ;
2015-01-07 16:51:20 +03:00
} ) ;
2016-02-19 14:09:46 +03:00
describe ( 'showTemporary' , function ( ) {
it ( 'shows a plain text notification with default timeout' , function ( ) {
var $row = OC . Notification . showTemporary ( 'My notification test' ) ;
2015-01-07 16:51:20 +03:00
2016-02-19 14:09:46 +03:00
expect ( showSpy . calledOnce ) . toEqual ( true ) ;
expect ( showSpy . firstCall . args [ 0 ] ) . toEqual ( 'My notification test' ) ;
expect ( showSpy . firstCall . args [ 1 ] ) . toEqual ( { isHTML : false , timeout : 7 } ) ;
2015-01-07 16:51:20 +03:00
2016-02-19 14:09:46 +03:00
expect ( $row ) . toBeDefined ( ) ;
expect ( $row . text ( ) ) . toEqual ( 'My notification test' ) ;
} ) ;
it ( 'shows a HTML notification with default timeout' , function ( ) {
var $row = OC . Notification . showTemporary ( '<a>My notification test</a>' , { isHTML : true } ) ;
expect ( showSpy . notCalled ) . toEqual ( true ) ;
expect ( showHtmlSpy . calledOnce ) . toEqual ( true ) ;
expect ( showHtmlSpy . firstCall . args [ 0 ] ) . toEqual ( '<a>My notification test</a>' ) ;
expect ( showHtmlSpy . firstCall . args [ 1 ] ) . toEqual ( { isHTML : true , timeout : 7 } ) ;
expect ( $row ) . toBeDefined ( ) ;
expect ( $row . text ( ) ) . toEqual ( 'My notification test' ) ;
} ) ;
it ( 'hides itself after 7 seconds' , function ( ) {
var $row = OC . Notification . showTemporary ( '' ) ;
// travel in time +7000 milliseconds
clock . tick ( 7000 ) ;
expect ( hideSpy . calledOnce ) . toEqual ( true ) ;
expect ( hideSpy . firstCall . args [ 0 ] ) . toEqual ( $row ) ;
} ) ;
2015-01-07 16:51:20 +03:00
} ) ;
2016-02-19 14:09:46 +03:00
describe ( 'show' , function ( ) {
it ( 'hides itself after a given time' , function ( ) {
OC . Notification . show ( '' , { timeout : 10 } ) ;
// travel in time +9 seconds
clock . tick ( 9000 ) ;
2015-01-07 16:51:20 +03:00
2016-02-19 14:09:46 +03:00
expect ( hideSpy . notCalled ) . toEqual ( true ) ;
2015-01-07 16:51:20 +03:00
2016-02-19 14:09:46 +03:00
// travel in time +1 seconds
clock . tick ( 1000 ) ;
expect ( hideSpy . calledOnce ) . toEqual ( true ) ;
} ) ;
it ( 'does not hide itself after a given time if a timeout of 0 is defined' , function ( ) {
OC . Notification . show ( '' , { timeout : 0 } ) ;
// travel in time +1000 seconds
clock . tick ( 1000000 ) ;
expect ( hideSpy . notCalled ) . toEqual ( true ) ;
} ) ;
it ( 'does not hide itself if no timeout given to show' , function ( ) {
OC . Notification . show ( '' ) ;
// travel in time +1000 seconds
clock . tick ( 1000000 ) ;
expect ( hideSpy . notCalled ) . toEqual ( true ) ;
} ) ;
2015-01-07 16:51:20 +03:00
} ) ;
2016-02-19 14:09:46 +03:00
it ( 'cumulates several notifications' , function ( ) {
var $row1 = OC . Notification . showTemporary ( 'One' ) ;
var $row2 = OC . Notification . showTemporary ( 'Two' , { timeout : 2 } ) ;
var $row3 = OC . Notification . showTemporary ( 'Three' ) ;
var $el = $ ( '#notification' ) ;
var $rows = $el . find ( '.row' ) ;
expect ( $rows . length ) . toEqual ( 3 ) ;
2015-01-07 16:51:20 +03:00
2016-02-19 14:09:46 +03:00
expect ( $rows . eq ( 0 ) . is ( $row1 ) ) . toEqual ( true ) ;
expect ( $rows . eq ( 1 ) . is ( $row2 ) ) . toEqual ( true ) ;
expect ( $rows . eq ( 2 ) . is ( $row3 ) ) . toEqual ( true ) ;
2015-01-07 16:51:20 +03:00
2016-02-19 14:09:46 +03:00
clock . tick ( 3000 ) ;
2015-01-07 16:51:20 +03:00
2016-02-19 14:09:46 +03:00
$rows = $el . find ( '.row' ) ;
expect ( $rows . length ) . toEqual ( 2 ) ;
2015-01-07 16:51:20 +03:00
2016-02-19 14:09:46 +03:00
expect ( $rows . eq ( 0 ) . is ( $row1 ) ) . toEqual ( true ) ;
expect ( $rows . eq ( 1 ) . is ( $row3 ) ) . toEqual ( true ) ;
} ) ;
it ( 'shows close button for error types' , function ( ) {
var $row = OC . Notification . showTemporary ( 'One' ) ;
var $rowError = OC . Notification . showTemporary ( 'Two' , { type : 'error' } ) ;
expect ( $row . find ( '.close' ) . length ) . toEqual ( 0 ) ;
expect ( $rowError . find ( '.close' ) . length ) . toEqual ( 1 ) ;
2015-01-07 16:51:20 +03:00
2016-02-19 14:09:46 +03:00
// after clicking, row is gone
$rowError . find ( '.close' ) . click ( ) ;
2015-01-07 16:51:20 +03:00
2016-02-19 14:09:46 +03:00
var $rows = $ ( '#notification' ) . find ( '.row' ) ;
expect ( $rows . length ) . toEqual ( 1 ) ;
expect ( $rows . eq ( 0 ) . is ( $row ) ) . toEqual ( true ) ;
2015-01-07 16:51:20 +03:00
} ) ;
2016-02-19 14:09:46 +03:00
it ( 'fades out the last notification but not the other ones' , function ( ) {
var fadeOutStub = sinon . stub ( $ . fn , 'fadeOut' ) ;
var $row1 = OC . Notification . show ( 'One' , { type : 'error' } ) ;
var $row2 = OC . Notification . show ( 'Two' , { type : 'error' } ) ;
OC . Notification . showTemporary ( 'Three' , { timeout : 2 } ) ;
2015-01-07 16:51:20 +03:00
2016-02-19 14:09:46 +03:00
var $el = $ ( '#notification' ) ;
var $rows = $el . find ( '.row' ) ;
expect ( $rows . length ) . toEqual ( 3 ) ;
2015-01-07 16:51:20 +03:00
2016-02-19 14:09:46 +03:00
clock . tick ( 3000 ) ;
2015-01-07 16:51:20 +03:00
2016-02-19 14:09:46 +03:00
$rows = $el . find ( '.row' ) ;
expect ( $rows . length ) . toEqual ( 2 ) ;
2015-01-07 16:51:20 +03:00
2016-02-19 14:09:46 +03:00
$row1 . find ( '.close' ) . click ( ) ;
clock . tick ( 1000 ) ;
2015-01-07 16:51:20 +03:00
2016-02-19 14:09:46 +03:00
expect ( fadeOutStub . notCalled ) . toEqual ( true ) ;
2015-01-07 16:51:20 +03:00
2016-02-19 14:09:46 +03:00
$row2 . find ( '.close' ) . click ( ) ;
2015-01-07 16:51:20 +03:00
clock . tick ( 1000 ) ;
2016-02-19 14:09:46 +03:00
expect ( fadeOutStub . calledOnce ) . toEqual ( true ) ;
2015-01-07 16:51:20 +03:00
2016-02-19 14:09:46 +03:00
expect ( $el . is ( ':empty' ) ) . toEqual ( false ) ;
fadeOutStub . yield ( ) ;
expect ( $el . is ( ':empty' ) ) . toEqual ( true ) ;
fadeOutStub . restore ( ) ;
2015-01-07 16:51:20 +03:00
} ) ;
2016-02-19 14:09:46 +03:00
it ( 'hides the first notification when calling hide without arguments' , function ( ) {
2017-01-13 13:33:12 +03:00
OC . Notification . show ( 'One' ) ;
2016-02-19 14:09:46 +03:00
var $row2 = OC . Notification . show ( 'Two' ) ;
2017-01-13 13:33:12 +03:00
spyOn ( console , 'warn' ) ;
2015-01-07 16:51:20 +03:00
2016-02-19 14:09:46 +03:00
var $el = $ ( '#notification' ) ;
var $rows = $el . find ( '.row' ) ;
expect ( $rows . length ) . toEqual ( 2 ) ;
2015-01-07 16:51:20 +03:00
2016-02-19 14:09:46 +03:00
OC . Notification . hide ( ) ;
2015-01-07 16:51:20 +03:00
2017-01-13 13:33:12 +03:00
expect ( console . warn ) . toHaveBeenCalled ( ) ;
2016-02-19 14:09:46 +03:00
$rows = $el . find ( '.row' ) ;
expect ( $rows . length ) . toEqual ( 1 ) ;
expect ( $rows . eq ( 0 ) . is ( $row2 ) ) . toEqual ( true ) ;
} ) ;
it ( 'hides the given notification when calling hide with argument' , function ( ) {
var $row1 = OC . Notification . show ( 'One' ) ;
var $row2 = OC . Notification . show ( 'Two' ) ;
2015-01-07 16:51:20 +03:00
2016-02-19 14:09:46 +03:00
var $el = $ ( '#notification' ) ;
var $rows = $el . find ( '.row' ) ;
expect ( $rows . length ) . toEqual ( 2 ) ;
2015-01-07 16:51:20 +03:00
2016-02-19 14:09:46 +03:00
OC . Notification . hide ( $row2 ) ;
2015-01-07 16:51:20 +03:00
2016-02-19 14:09:46 +03:00
$rows = $el . find ( '.row' ) ;
expect ( $rows . length ) . toEqual ( 1 ) ;
expect ( $rows . eq ( 0 ) . is ( $row1 ) ) . toEqual ( true ) ;
2015-01-07 16:51:20 +03:00
} ) ;
} ) ;
2015-12-10 20:08:40 +03:00
describe ( 'global ajax errors' , function ( ) {
2016-03-23 12:53:40 +03:00
var reloadStub , ajaxErrorStub , clock ;
2016-04-21 00:09:59 +03:00
var notificationStub ;
2017-02-04 11:51:52 +03:00
var waitTimeMs = 6500 ;
2016-12-02 15:40:23 +03:00
var oldCurrentUser ;
2015-12-10 20:08:40 +03:00
beforeEach ( function ( ) {
2016-12-02 15:40:23 +03:00
oldCurrentUser = OC . currentUser ;
OC . currentUser = 'dummy' ;
2016-03-23 12:53:40 +03:00
clock = sinon . useFakeTimers ( ) ;
2015-12-10 20:08:40 +03:00
reloadStub = sinon . stub ( OC , 'reload' ) ;
2016-04-21 00:09:59 +03:00
notificationStub = sinon . stub ( OC . Notification , 'show' ) ;
2015-12-10 20:08:40 +03:00
// unstub the error processing method
ajaxErrorStub = OC . _processAjaxError ;
ajaxErrorStub . restore ( ) ;
window . initCore ( ) ;
} ) ;
afterEach ( function ( ) {
2016-12-02 15:40:23 +03:00
OC . currentUser = oldCurrentUser ;
2015-12-10 20:08:40 +03:00
reloadStub . restore ( ) ;
2016-04-21 00:09:59 +03:00
notificationStub . restore ( ) ;
2016-03-23 12:53:40 +03:00
clock . restore ( ) ;
2015-12-10 20:08:40 +03:00
} ) ;
2016-03-23 12:53:40 +03:00
it ( 'reloads current page in case of auth error' , function ( ) {
2015-12-10 20:08:40 +03:00
var dataProvider = [
[ 200 , false ] ,
[ 400 , false ] ,
2016-09-20 00:49:42 +03:00
[ 0 , false ] ,
2015-12-10 20:08:40 +03:00
[ 401 , true ] ,
[ 302 , true ] ,
2016-03-23 12:53:40 +03:00
[ 303 , true ] ,
2015-12-10 20:08:40 +03:00
[ 307 , true ]
] ;
for ( var i = 0 ; i < dataProvider . length ; i ++ ) {
var xhr = { status : dataProvider [ i ] [ 0 ] } ;
var expectedCall = dataProvider [ i ] [ 1 ] ;
reloadStub . reset ( ) ;
2016-03-23 12:53:40 +03:00
OC . _reloadCalled = false ;
2015-12-10 20:08:40 +03:00
$ ( document ) . trigger ( new $ . Event ( 'ajaxError' ) , xhr ) ;
2016-03-23 12:53:40 +03:00
// trigger timers
2016-04-21 00:09:59 +03:00
clock . tick ( waitTimeMs ) ;
2016-03-23 12:53:40 +03:00
2015-12-10 20:08:40 +03:00
if ( expectedCall ) {
expect ( reloadStub . calledOnce ) . toEqual ( true ) ;
} else {
expect ( reloadStub . notCalled ) . toEqual ( true ) ;
}
}
} ) ;
2016-03-23 12:53:40 +03:00
it ( 'reload only called once in case of auth error' , function ( ) {
var xhr = { status : 401 } ;
$ ( document ) . trigger ( new $ . Event ( 'ajaxError' ) , xhr ) ;
$ ( document ) . trigger ( new $ . Event ( 'ajaxError' ) , xhr ) ;
// trigger timers
2016-04-21 00:09:59 +03:00
clock . tick ( waitTimeMs ) ;
2016-03-23 12:53:40 +03:00
expect ( reloadStub . calledOnce ) . toEqual ( true ) ;
} ) ;
it ( 'does not reload the page if the user was navigating away' , function ( ) {
var xhr = { status : 0 } ;
OC . _userIsNavigatingAway = true ;
clock . tick ( 100 ) ;
$ ( document ) . trigger ( new $ . Event ( 'ajaxError' ) , xhr ) ;
2016-04-21 00:09:59 +03:00
clock . tick ( waitTimeMs ) ;
2016-03-23 12:53:40 +03:00
expect ( reloadStub . notCalled ) . toEqual ( true ) ;
} ) ;
2016-04-21 00:09:59 +03:00
it ( 'displays notification' , function ( ) {
var xhr = { status : 401 } ;
2017-02-04 11:51:52 +03:00
notificationUpdateStub = sinon . stub ( OC . Notification , 'showUpdate' ) ;
2016-04-21 00:09:59 +03:00
$ ( document ) . trigger ( new $ . Event ( 'ajaxError' ) , xhr ) ;
clock . tick ( waitTimeMs ) ;
2017-02-04 11:51:52 +03:00
expect ( notificationUpdateStub . notCalled ) . toEqual ( false ) ;
2016-04-21 00:09:59 +03:00
} ) ;
2016-09-20 00:49:42 +03:00
it ( 'shows a temporary notification if the connection is lost' , function ( ) {
var xhr = { status : 0 } ;
spyOn ( OC , '_ajaxConnectionLostHandler' ) ;
$ ( document ) . trigger ( new $ . Event ( 'ajaxError' ) , xhr ) ;
clock . tick ( 101 ) ;
expect ( OC . _ajaxConnectionLostHandler . calls . count ( ) ) . toBe ( 1 ) ;
} ) ;
2016-03-23 12:53:40 +03:00
} ) ;
2017-10-20 18:11:59 +03:00
describe ( 'Snapper' , function ( ) {
var snapConstructorStub ;
var snapperStub ;
var clock ;
beforeEach ( function ( ) {
snapConstructorStub = sinon . stub ( window , 'Snap' ) ;
snapperStub = { } ;
snapperStub . enable = sinon . stub ( ) ;
snapperStub . disable = sinon . stub ( ) ;
snapperStub . close = sinon . stub ( ) ;
snapConstructorStub . returns ( snapperStub ) ;
clock = sinon . useFakeTimers ( ) ;
// _.now could have been set to Date.now before Sinon replaced it
// with a fake version, so _.now must be stubbed to ensure that the
// fake Date.now will be called instead of the original one.
_ . now = sinon . stub ( _ , 'now' ) . callsFake ( function ( ) {
return new Date ( ) . getTime ( ) ;
} ) ;
$ ( '#testArea' ) . append ( '<div id="app-navigation">The navigation bar</div><div id="app-content">Content</div>' ) ;
} ) ;
afterEach ( function ( ) {
snapConstructorStub . restore ( ) ;
clock . restore ( ) ;
_ . now . restore ( ) ;
// Remove the event handler for the resize event added to the window
// due to calling window.initCore() when there is an #app-navigation
// element.
$ ( window ) . off ( 'resize' ) ;
viewport . reset ( ) ;
} ) ;
it ( 'is enabled on a narrow screen' , function ( ) {
viewport . set ( 480 ) ;
window . initCore ( ) ;
expect ( snapConstructorStub . calledOnce ) . toBe ( true ) ;
expect ( snapperStub . enable . calledOnce ) . toBe ( true ) ;
expect ( snapperStub . disable . called ) . toBe ( false ) ;
} ) ;
2017-10-23 02:01:01 +03:00
it ( 'is disabled when disallowing the gesture on a narrow screen' , function ( ) {
viewport . set ( 480 ) ;
window . initCore ( ) ;
expect ( snapperStub . enable . calledOnce ) . toBe ( true ) ;
expect ( snapperStub . disable . called ) . toBe ( false ) ;
expect ( snapperStub . close . called ) . toBe ( false ) ;
OC . disallowNavigationBarSlideGesture ( ) ;
expect ( snapperStub . enable . calledOnce ) . toBe ( true ) ;
expect ( snapperStub . disable . calledOnce ) . toBe ( true ) ;
2017-12-14 20:12:12 +03:00
expect ( snapperStub . disable . alwaysCalledWithExactly ( true ) ) . toBe ( true ) ;
2017-10-23 02:01:01 +03:00
expect ( snapperStub . close . called ) . toBe ( false ) ;
} ) ;
it ( 'is not disabled again when disallowing the gesture twice on a narrow screen' , function ( ) {
viewport . set ( 480 ) ;
window . initCore ( ) ;
expect ( snapperStub . enable . calledOnce ) . toBe ( true ) ;
expect ( snapperStub . disable . called ) . toBe ( false ) ;
expect ( snapperStub . close . called ) . toBe ( false ) ;
OC . disallowNavigationBarSlideGesture ( ) ;
expect ( snapperStub . enable . calledOnce ) . toBe ( true ) ;
expect ( snapperStub . disable . calledOnce ) . toBe ( true ) ;
2017-12-14 20:12:12 +03:00
expect ( snapperStub . disable . alwaysCalledWithExactly ( true ) ) . toBe ( true ) ;
2017-10-23 02:01:01 +03:00
expect ( snapperStub . close . called ) . toBe ( false ) ;
OC . disallowNavigationBarSlideGesture ( ) ;
expect ( snapperStub . enable . calledOnce ) . toBe ( true ) ;
expect ( snapperStub . disable . calledOnce ) . toBe ( true ) ;
expect ( snapperStub . close . called ) . toBe ( false ) ;
} ) ;
it ( 'is enabled when allowing the gesture after disallowing it on a narrow screen' , function ( ) {
viewport . set ( 480 ) ;
window . initCore ( ) ;
expect ( snapperStub . enable . calledOnce ) . toBe ( true ) ;
expect ( snapperStub . disable . called ) . toBe ( false ) ;
expect ( snapperStub . close . called ) . toBe ( false ) ;
OC . disallowNavigationBarSlideGesture ( ) ;
expect ( snapperStub . enable . calledOnce ) . toBe ( true ) ;
expect ( snapperStub . disable . calledOnce ) . toBe ( true ) ;
2017-12-14 20:12:12 +03:00
expect ( snapperStub . disable . alwaysCalledWithExactly ( true ) ) . toBe ( true ) ;
2017-10-23 02:01:01 +03:00
expect ( snapperStub . close . called ) . toBe ( false ) ;
OC . allowNavigationBarSlideGesture ( ) ;
expect ( snapperStub . enable . calledTwice ) . toBe ( true ) ;
expect ( snapperStub . disable . calledOnce ) . toBe ( true ) ;
expect ( snapperStub . close . called ) . toBe ( false ) ;
} ) ;
it ( 'is not enabled again when allowing the gesture twice after disallowing it on a narrow screen' , function ( ) {
viewport . set ( 480 ) ;
window . initCore ( ) ;
expect ( snapperStub . enable . calledOnce ) . toBe ( true ) ;
expect ( snapperStub . disable . called ) . toBe ( false ) ;
expect ( snapperStub . close . called ) . toBe ( false ) ;
OC . disallowNavigationBarSlideGesture ( ) ;
expect ( snapperStub . enable . calledOnce ) . toBe ( true ) ;
expect ( snapperStub . disable . calledOnce ) . toBe ( true ) ;
2017-12-14 20:12:12 +03:00
expect ( snapperStub . disable . alwaysCalledWithExactly ( true ) ) . toBe ( true ) ;
2017-10-23 02:01:01 +03:00
expect ( snapperStub . close . called ) . toBe ( false ) ;
OC . allowNavigationBarSlideGesture ( ) ;
expect ( snapperStub . enable . calledTwice ) . toBe ( true ) ;
expect ( snapperStub . disable . calledOnce ) . toBe ( true ) ;
expect ( snapperStub . close . called ) . toBe ( false ) ;
OC . allowNavigationBarSlideGesture ( ) ;
expect ( snapperStub . enable . calledTwice ) . toBe ( true ) ;
expect ( snapperStub . disable . calledOnce ) . toBe ( true ) ;
expect ( snapperStub . close . called ) . toBe ( false ) ;
} ) ;
2017-10-20 18:11:59 +03:00
it ( 'is disabled on a wide screen' , function ( ) {
viewport . set ( 1280 ) ;
window . initCore ( ) ;
expect ( snapConstructorStub . calledOnce ) . toBe ( true ) ;
expect ( snapperStub . enable . called ) . toBe ( false ) ;
expect ( snapperStub . disable . calledOnce ) . toBe ( true ) ;
} ) ;
2017-10-23 02:01:01 +03:00
it ( 'is not disabled again when disallowing the gesture on a wide screen' , function ( ) {
viewport . set ( 1280 ) ;
window . initCore ( ) ;
expect ( snapperStub . enable . called ) . toBe ( false ) ;
expect ( snapperStub . disable . calledOnce ) . toBe ( true ) ;
expect ( snapperStub . close . calledOnce ) . toBe ( true ) ;
OC . disallowNavigationBarSlideGesture ( ) ;
expect ( snapperStub . enable . called ) . toBe ( false ) ;
expect ( snapperStub . disable . calledOnce ) . toBe ( true ) ;
expect ( snapperStub . close . calledOnce ) . toBe ( true ) ;
} ) ;
it ( 'is not enabled when allowing the gesture after disallowing it on a wide screen' , function ( ) {
viewport . set ( 1280 ) ;
window . initCore ( ) ;
expect ( snapperStub . enable . called ) . toBe ( false ) ;
expect ( snapperStub . disable . calledOnce ) . toBe ( true ) ;
expect ( snapperStub . close . calledOnce ) . toBe ( true ) ;
OC . disallowNavigationBarSlideGesture ( ) ;
expect ( snapperStub . enable . called ) . toBe ( false ) ;
expect ( snapperStub . disable . calledOnce ) . toBe ( true ) ;
expect ( snapperStub . close . calledOnce ) . toBe ( true ) ;
OC . allowNavigationBarSlideGesture ( ) ;
expect ( snapperStub . enable . called ) . toBe ( false ) ;
expect ( snapperStub . disable . calledOnce ) . toBe ( true ) ;
expect ( snapperStub . close . calledOnce ) . toBe ( true ) ;
} ) ;
2017-10-20 18:11:59 +03:00
it ( 'is enabled when resizing to a narrow screen' , function ( ) {
viewport . set ( 1280 ) ;
window . initCore ( ) ;
expect ( snapperStub . enable . called ) . toBe ( false ) ;
expect ( snapperStub . disable . calledOnce ) . toBe ( true ) ;
viewport . set ( 480 ) ;
// Setting the viewport width does not automatically trigger a
// resize.
$ ( window ) . resize ( ) ;
// The resize handler is debounced to be executed a few milliseconds
// after the resize event.
clock . tick ( 1000 ) ;
expect ( snapperStub . enable . calledOnce ) . toBe ( true ) ;
expect ( snapperStub . disable . calledOnce ) . toBe ( true ) ;
} ) ;
2017-10-23 02:01:01 +03:00
it ( 'is not enabled when resizing to a narrow screen after disallowing the gesture' , function ( ) {
viewport . set ( 1280 ) ;
window . initCore ( ) ;
expect ( snapperStub . enable . called ) . toBe ( false ) ;
expect ( snapperStub . disable . calledOnce ) . toBe ( true ) ;
OC . disallowNavigationBarSlideGesture ( ) ;
expect ( snapperStub . enable . called ) . toBe ( false ) ;
expect ( snapperStub . disable . calledOnce ) . toBe ( true ) ;
viewport . set ( 480 ) ;
// Setting the viewport width does not automatically trigger a
// resize.
$ ( window ) . resize ( ) ;
// The resize handler is debounced to be executed a few milliseconds
// after the resize event.
clock . tick ( 1000 ) ;
expect ( snapperStub . enable . called ) . toBe ( false ) ;
expect ( snapperStub . disable . calledOnce ) . toBe ( true ) ;
} ) ;
it ( 'is enabled when resizing to a narrow screen after disallowing the gesture and allowing it' , function ( ) {
viewport . set ( 1280 ) ;
window . initCore ( ) ;
expect ( snapperStub . enable . called ) . toBe ( false ) ;
expect ( snapperStub . disable . calledOnce ) . toBe ( true ) ;
OC . disallowNavigationBarSlideGesture ( ) ;
expect ( snapperStub . enable . called ) . toBe ( false ) ;
expect ( snapperStub . disable . calledOnce ) . toBe ( true ) ;
OC . allowNavigationBarSlideGesture ( ) ;
expect ( snapperStub . enable . called ) . toBe ( false ) ;
expect ( snapperStub . disable . calledOnce ) . toBe ( true ) ;
viewport . set ( 480 ) ;
// Setting the viewport width does not automatically trigger a
// resize.
$ ( window ) . resize ( ) ;
// The resize handler is debounced to be executed a few milliseconds
// after the resize event.
clock . tick ( 1000 ) ;
expect ( snapperStub . enable . calledOnce ) . toBe ( true ) ;
expect ( snapperStub . disable . calledOnce ) . toBe ( true ) ;
} ) ;
it ( 'is enabled when allowing the gesture after disallowing it and resizing to a narrow screen' , function ( ) {
viewport . set ( 1280 ) ;
window . initCore ( ) ;
expect ( snapperStub . enable . called ) . toBe ( false ) ;
expect ( snapperStub . disable . calledOnce ) . toBe ( true ) ;
OC . disallowNavigationBarSlideGesture ( ) ;
expect ( snapperStub . enable . called ) . toBe ( false ) ;
expect ( snapperStub . disable . calledOnce ) . toBe ( true ) ;
viewport . set ( 480 ) ;
// Setting the viewport width does not automatically trigger a
// resize.
$ ( window ) . resize ( ) ;
// The resize handler is debounced to be executed a few milliseconds
// after the resize event.
clock . tick ( 1000 ) ;
expect ( snapperStub . enable . called ) . toBe ( false ) ;
expect ( snapperStub . disable . calledOnce ) . toBe ( true ) ;
OC . allowNavigationBarSlideGesture ( ) ;
expect ( snapperStub . enable . calledOnce ) . toBe ( true ) ;
expect ( snapperStub . disable . calledOnce ) . toBe ( true ) ;
} ) ;
it ( 'is disabled when disallowing the gesture after disallowing it, resizing to a narrow screen and allowing it' , function ( ) {
viewport . set ( 1280 ) ;
window . initCore ( ) ;
expect ( snapperStub . enable . called ) . toBe ( false ) ;
expect ( snapperStub . disable . calledOnce ) . toBe ( true ) ;
OC . disallowNavigationBarSlideGesture ( ) ;
expect ( snapperStub . enable . called ) . toBe ( false ) ;
expect ( snapperStub . disable . calledOnce ) . toBe ( true ) ;
viewport . set ( 480 ) ;
// Setting the viewport width does not automatically trigger a
// resize.
$ ( window ) . resize ( ) ;
// The resize handler is debounced to be executed a few milliseconds
// after the resize event.
clock . tick ( 1000 ) ;
expect ( snapperStub . enable . called ) . toBe ( false ) ;
expect ( snapperStub . disable . calledOnce ) . toBe ( true ) ;
OC . allowNavigationBarSlideGesture ( ) ;
expect ( snapperStub . enable . calledOnce ) . toBe ( true ) ;
expect ( snapperStub . disable . calledOnce ) . toBe ( true ) ;
OC . disallowNavigationBarSlideGesture ( ) ;
expect ( snapperStub . enable . calledOnce ) . toBe ( true ) ;
expect ( snapperStub . disable . calledTwice ) . toBe ( true ) ;
2017-12-14 20:12:12 +03:00
expect ( snapperStub . disable . getCall ( 1 ) . calledWithExactly ( true ) ) . toBe ( true ) ;
2017-10-23 02:01:01 +03:00
} ) ;
2017-10-20 18:11:59 +03:00
it ( 'is disabled when resizing to a wide screen' , function ( ) {
viewport . set ( 480 ) ;
window . initCore ( ) ;
expect ( snapperStub . enable . calledOnce ) . toBe ( true ) ;
expect ( snapperStub . disable . called ) . toBe ( false ) ;
expect ( snapperStub . close . called ) . toBe ( false ) ;
viewport . set ( 1280 ) ;
// Setting the viewport width does not automatically trigger a
// resize.
$ ( window ) . resize ( ) ;
// The resize handler is debounced to be executed a few milliseconds
// after the resize event.
clock . tick ( 1000 ) ;
expect ( snapperStub . enable . calledOnce ) . toBe ( true ) ;
expect ( snapperStub . disable . calledOnce ) . toBe ( true ) ;
expect ( snapperStub . close . calledOnce ) . toBe ( true ) ;
} ) ;
2017-10-23 02:01:01 +03:00
it ( 'is not disabled again when disallowing the gesture after resizing to a wide screen' , function ( ) {
viewport . set ( 480 ) ;
window . initCore ( ) ;
expect ( snapperStub . enable . calledOnce ) . toBe ( true ) ;
expect ( snapperStub . disable . called ) . toBe ( false ) ;
expect ( snapperStub . close . called ) . toBe ( false ) ;
viewport . set ( 1280 ) ;
// Setting the viewport width does not automatically trigger a
// resize.
$ ( window ) . resize ( ) ;
// The resize handler is debounced to be executed a few milliseconds
// after the resize event.
clock . tick ( 1000 ) ;
expect ( snapperStub . enable . calledOnce ) . toBe ( true ) ;
expect ( snapperStub . disable . calledOnce ) . toBe ( true ) ;
expect ( snapperStub . close . calledOnce ) . toBe ( true ) ;
OC . disallowNavigationBarSlideGesture ( ) ;
expect ( snapperStub . enable . calledOnce ) . toBe ( true ) ;
expect ( snapperStub . disable . calledOnce ) . toBe ( true ) ;
expect ( snapperStub . close . calledOnce ) . toBe ( true ) ;
} ) ;
it ( 'is not enabled when allowing the gesture after disallowing it, resizing to a narrow screen and resizing to a wide screen' , function ( ) {
viewport . set ( 1280 ) ;
window . initCore ( ) ;
expect ( snapperStub . enable . called ) . toBe ( false ) ;
expect ( snapperStub . disable . calledOnce ) . toBe ( true ) ;
expect ( snapperStub . close . calledOnce ) . toBe ( true ) ;
OC . disallowNavigationBarSlideGesture ( ) ;
expect ( snapperStub . enable . called ) . toBe ( false ) ;
expect ( snapperStub . disable . calledOnce ) . toBe ( true ) ;
expect ( snapperStub . close . calledOnce ) . toBe ( true ) ;
viewport . set ( 480 ) ;
// Setting the viewport width does not automatically trigger a
// resize.
$ ( window ) . resize ( ) ;
// The resize handler is debounced to be executed a few milliseconds
// after the resize event.
clock . tick ( 1000 ) ;
expect ( snapperStub . enable . called ) . toBe ( false ) ;
expect ( snapperStub . disable . calledOnce ) . toBe ( true ) ;
expect ( snapperStub . close . calledOnce ) . toBe ( true ) ;
viewport . set ( 1280 ) ;
$ ( window ) . resize ( ) ;
clock . tick ( 1000 ) ;
expect ( snapperStub . enable . called ) . toBe ( false ) ;
expect ( snapperStub . disable . calledTwice ) . toBe ( true ) ;
expect ( snapperStub . close . calledTwice ) . toBe ( true ) ;
OC . allowNavigationBarSlideGesture ( ) ;
expect ( snapperStub . enable . called ) . toBe ( false ) ;
expect ( snapperStub . disable . calledTwice ) . toBe ( true ) ;
expect ( snapperStub . close . calledTwice ) . toBe ( true ) ;
} ) ;
2017-10-20 18:11:59 +03:00
} ) ;
2018-01-06 15:35:23 +03:00
describe ( 'Requires password confirmation' , function ( ) {
var stubMomentNow ;
var stubJsPageLoadTime ;
afterEach ( function ( ) {
delete window . nc _pageLoad ;
delete window . nc _lastLogin ;
delete window . backendAllowsPasswordConfirmation ;
stubMomentNow . restore ( ) ;
stubJsPageLoadTime . restore ( ) ;
} ) ;
2018-01-10 18:42:25 +03:00
it ( 'should not show the password confirmation dialog when server time is earlier than local time' , function ( ) {
2018-01-06 15:35:23 +03:00
// add server variables
window . nc _pageLoad = parseInt ( new Date ( 2018 , 0 , 3 , 1 , 15 , 0 ) . getTime ( ) / 1000 ) ;
window . nc _lastLogin = parseInt ( new Date ( 2018 , 0 , 3 , 1 , 0 , 0 ) . getTime ( ) / 1000 ) ;
window . backendAllowsPasswordConfirmation = true ;
stubJsPageLoadTime = sinon . stub ( OC . PasswordConfirmation , 'pageLoadTime' ) . value ( new Date ( 2018 , 0 , 3 , 12 , 15 , 0 ) . getTime ( ) ) ;
stubMomentNow = sinon . stub ( moment , 'now' ) . returns ( new Date ( 2018 , 0 , 3 , 12 , 20 , 0 ) . getTime ( ) ) ;
expect ( OC . PasswordConfirmation . requiresPasswordConfirmation ( ) ) . toBeFalsy ( ) ;
} ) ;
2018-01-10 18:42:25 +03:00
it ( 'should show the password confirmation dialog when server time is earlier than local time' , function ( ) {
2018-01-06 15:35:23 +03:00
// add server variables
window . nc _pageLoad = parseInt ( new Date ( 2018 , 0 , 3 , 1 , 15 , 0 ) . getTime ( ) / 1000 ) ;
window . nc _lastLogin = parseInt ( new Date ( 2018 , 0 , 3 , 1 , 0 , 0 ) . getTime ( ) / 1000 ) ;
window . backendAllowsPasswordConfirmation = true ;
stubJsPageLoadTime = sinon . stub ( OC . PasswordConfirmation , 'pageLoadTime' ) . value ( new Date ( 2018 , 0 , 3 , 12 , 15 , 0 ) . getTime ( ) ) ;
stubMomentNow = sinon . stub ( moment , 'now' ) . returns ( new Date ( 2018 , 0 , 3 , 12 , 31 , 0 ) . getTime ( ) ) ;
expect ( OC . PasswordConfirmation . requiresPasswordConfirmation ( ) ) . toBeTruthy ( ) ;
} ) ;
2018-01-10 18:42:25 +03:00
it ( 'should not show the password confirmation dialog when server time is later than local time' , function ( ) {
// add server variables
window . nc _pageLoad = parseInt ( new Date ( 2018 , 0 , 3 , 23 , 15 , 0 ) . getTime ( ) / 1000 ) ;
window . nc _lastLogin = parseInt ( new Date ( 2018 , 0 , 3 , 23 , 0 , 0 ) . getTime ( ) / 1000 ) ;
window . backendAllowsPasswordConfirmation = true ;
stubJsPageLoadTime = sinon . stub ( OC . PasswordConfirmation , 'pageLoadTime' ) . value ( new Date ( 2018 , 0 , 3 , 12 , 15 , 0 ) . getTime ( ) ) ;
stubMomentNow = sinon . stub ( moment , 'now' ) . returns ( new Date ( 2018 , 0 , 3 , 12 , 20 , 0 ) . getTime ( ) ) ;
expect ( OC . PasswordConfirmation . requiresPasswordConfirmation ( ) ) . toBeFalsy ( ) ;
} ) ;
it ( 'should show the password confirmation dialog when server time is later than local time' , function ( ) {
// add server variables
window . nc _pageLoad = parseInt ( new Date ( 2018 , 0 , 3 , 23 , 15 , 0 ) . getTime ( ) / 1000 ) ;
window . nc _lastLogin = parseInt ( new Date ( 2018 , 0 , 3 , 23 , 0 , 0 ) . getTime ( ) / 1000 ) ;
window . backendAllowsPasswordConfirmation = true ;
stubJsPageLoadTime = sinon . stub ( OC . PasswordConfirmation , 'pageLoadTime' ) . value ( new Date ( 2018 , 0 , 3 , 12 , 15 , 0 ) . getTime ( ) ) ;
stubMomentNow = sinon . stub ( moment , 'now' ) . returns ( new Date ( 2018 , 0 , 3 , 12 , 31 , 0 ) . getTime ( ) ) ;
expect ( OC . PasswordConfirmation . requiresPasswordConfirmation ( ) ) . toBeTruthy ( ) ;
} ) ;
2018-01-06 15:35:23 +03:00
} ) ;
2014-01-12 21:57:53 +04:00
} ) ;