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
/* global OC */
2014-01-12 21:57:53 +04:00
describe ( 'Core base tests' , function ( ) {
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.' ) ;
} ) ;
} ) ;
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 ( ) {
2014-04-09 17:23:09 +04:00
var svgSupportStub = sinon . stub ( OC . Util , 'hasSVGSupport' , function ( ) { return true ; } ) ;
2014-01-12 21:57:53 +04:00
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' ) ;
svgSupportStub . restore ( ) ;
} ) ;
it ( 'Generates image path with svg extension when svg support exists' , function ( ) {
2014-04-09 17:23:09 +04:00
var svgSupportStub = sinon . stub ( OC . Util , 'hasSVGSupport' , function ( ) { return true ; } ) ;
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' ) ;
svgSupportStub . restore ( ) ;
} ) ;
it ( 'Generates image path with png ext when svg support is not available' , function ( ) {
2014-04-09 17:23:09 +04:00
var svgSupportStub = sinon . stub ( OC . Util , 'hasSVGSupport' , function ( ) { return false ; } ) ;
2014-01-12 21:57:53 +04:00
expect ( OC . imagePath ( 'core' , 'somefile' ) ) . toEqual ( OC . webroot + '/core/img/somefile.png' ) ;
expect ( OC . imagePath ( TESTAPP , 'somefile' ) ) . toEqual ( TESTAPP _ROOT + '/img/somefile.png' ) ;
svgSupportStub . restore ( ) ;
} ) ;
} ) ;
} ) ;
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' } , '{}' ) ;
} ) ;
} ) ;
afterEach ( function ( ) {
clock . restore ( ) ;
window . oc _config = oldConfig ;
routeStub . restore ( ) ;
} ) ;
it ( 'sends heartbeat half the session lifetime when heartbeat enabled' , function ( ) {
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 ) ;
} ) ;
it ( 'does no send heartbeat when heartbeat disabled' , function ( ) {
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-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' ) ;
} ) ;
it ( 'substitutes parameters' , function ( ) {
expect ( OC . generateUrl ( 'apps/files/download{file}' , { file : '/Welcome.txt' } ) ) . toEqual ( OC . webroot + '/index.php/apps/files/download/Welcome.txt' ) ;
} ) ;
} ) ;
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 ;
2014-06-02 20:09:26 +04:00
var clock ;
2014-03-18 16:09:25 +04:00
beforeEach ( function ( ) {
2014-06-02 20:09:26 +04:00
clock = sinon . useFakeTimers ( ) ;
2014-03-18 16:09:25 +04:00
$ ( '#testArea' ) . append ( '<div id="header">' +
'<a id="owncloud" href="#"></a>' +
'</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 ( ) {
2014-06-02 20:09:26 +04:00
clock . restore ( ) ;
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 ( ) ;
$navigation . hide ( ) ; // normally done through media query triggered CSS
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-04-04 13:32:07 +04:00
describe ( 'SVG extension replacement' , function ( ) {
var svgSupportStub ;
beforeEach ( function ( ) {
svgSupportStub = sinon . stub ( OC . Util , 'hasSVGSupport' ) ;
} ) ;
afterEach ( function ( ) {
svgSupportStub . restore ( ) ;
} ) ;
it ( 'does not replace svg extension with png when SVG is supported' , function ( ) {
svgSupportStub . returns ( true ) ;
expect (
OC . Util . replaceSVGIcon ( '/path/to/myicon.svg?someargs=1' )
) . toEqual (
'/path/to/myicon.svg?someargs=1'
) ;
} ) ;
it ( 'replaces svg extension with png when SVG not supported' , function ( ) {
svgSupportStub . returns ( false ) ;
expect (
OC . Util . replaceSVGIcon ( '/path/to/myicon.svg?someargs=1' )
) . toEqual (
'/path/to/myicon.png?someargs=1'
) ;
} ) ;
} ) ;
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' ] ,
[ 125 , '125 B' ] ,
[ 128000 , '125 kB' ] ,
[ 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 = [
[ 0 , '0 kB' ] ,
[ 125 , '< 1 kB' ] ,
[ 128000 , '125 kB' ] ,
[ 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
} ) ;
} ) ;
2014-01-12 21:57:53 +04:00
} ) ;
2014-02-04 16:56:41 +04:00