Init version of js unit testing.

This commit is contained in:
Martin Edenhofer 2012-11-23 09:36:12 +01:00
parent 031d2c671e
commit f1d146f3bb
12 changed files with 2551 additions and 13 deletions

View file

@ -7,7 +7,7 @@ class App.Config
@get: ( key, group ) -> @get: ( key, group ) ->
if _instance == undefined if _instance == undefined
_instance ?= new _Singleton _instance ?= new _Singleton
_instance.get( key ) _instance.get( key, group )
@set: ( key, value, group ) -> @set: ( key, value, group ) ->
if _instance == undefined if _instance == undefined

View file

@ -24,10 +24,10 @@ class App.Auth
@loginCheck: -> @loginCheck: ->
App.Log.log 'Auth', 'notice', 'loginCheck' App.Log.log 'Auth', 'notice', 'loginCheck'
App.Com.ajax( App.Com.ajax(
id: 'login_check', id: 'login_check'
async: false, async: false
type: 'GET', type: 'GET'
url: '/signshow', url: '/signshow'
success: (data, status, xhr) => success: (data, status, xhr) =>
App.Log.log 'Auth', 'notice', 'logincheck:success', data App.Log.log 'Auth', 'notice', 'logincheck:success', data
@ -87,9 +87,9 @@ class App.Auth
@logout: -> @logout: ->
App.Log.log 'Auth', 'notice', 'logout' App.Log.log 'Auth', 'notice', 'logout'
App.Com.ajax( App.Com.ajax(
id: 'logout', id: 'logout'
type: 'DELETE', type: 'DELETE'
url: '/signout', url: '/signout'
success: => success: =>
# update websocked auth info # update websocked auth info

View file

@ -21,15 +21,18 @@ class App.i18n
_instance ?= new _Singleton _instance ?= new _Singleton
_instance.timestamp( args ) _instance.timestamp( args )
@set: ( args ) ->
if _instance == undefined
_instance ?= new _Singleton
_instance.set( args )
class _Singleton extends Spine.Module class _Singleton extends Spine.Module
@include App.Log @include App.Log
constructor: -> constructor: ->
@locale = 'de' @map = {}
@timestampFormat = 'yyyy-mm-dd HH:MM'
@set( @locale )
# $('.translation [contenteditable]') # observe if text has been translated
$('body') $('body')
.delegate '.translation', 'focus', (e) => .delegate '.translation', 'focus', (e) =>
$this = $(e.target) $this = $(e.target)
@ -76,6 +79,8 @@ class _Singleton extends Spine.Module
return $this return $this
set: ( locale ) -> set: ( locale ) ->
@locale = locale
@timestampFormat = 'yyyy-mm-dd HH:MM'
@map = {} @map = {}
App.Com.ajax( App.Com.ajax(
id: 'i18n-set-' + locale, id: 'i18n-set-' + locale,

View file

@ -0,0 +1,17 @@
class TestsController < ApplicationController
# GET /test
def index
respond_to do |format|
format.html # index.html.erb
end
end
# GET /test/wait
def wait
sleep params[:sec].to_i
result = { :success => true }
render :json => result
end
end

View file

@ -15,9 +15,15 @@ class TranslationsController < ApplicationController
list.push data list.push data
} }
timestamp_map_default = 'yyyy-mm-dd HH:MM'
timestamp_map = {
:de => 'dd.mm.yyyy HH:MM',
}
timestamp = timestamp_map[ params[:locale].to_sym ] || timestamp_map_default
render :json => { render :json => {
:list => list, :list => list,
:timestampFormat => 'dd.mm.yyyy HH:MM', :timestampFormat => timestamp,
} }
end end

View file

@ -0,0 +1,15 @@
<link rel="stylesheet" href="/assets/tests/qunit-1.10.0.css">
<script src="/assets/tests/qunit-1.10.0.js"></script>
<script src="/assets/tests/tests.js"></script>
<style type="text/css">
body {
padding-top: 0px;
}
</style>
<script type="text/javascript">
</script>
<div id="qunit"></div>

9
config/routes/test.rb Normal file
View file

@ -0,0 +1,9 @@
module ExtraRoutes
def add(map)
map.match '/test', :to => 'tests#index'
map.match '/test/wait/:sec', :to => 'tests#wait'
end
module_function :add
end

View file

@ -1824,6 +1824,8 @@ Translation.create( :locale => 'de', :source => "Create your first Ticket", :tar
Translation.create( :locale => 'de', :source => "You have not created a Ticket yet.", :target => "Sie haben noch kein Ticket erstellt.", :updated_by_id => 1, :created_by_id => 1 ) Translation.create( :locale => 'de', :source => "You have not created a Ticket yet.", :target => "Sie haben noch kein Ticket erstellt.", :updated_by_id => 1, :created_by_id => 1 )
Translation.create( :locale => 'de', :source => "The way to communicate with us is this thing called \"Ticket\".", :target => "Der Weg um mit uns zu kommunizieren ist das sogenannte \"Ticket\".", :updated_by_id => 1, :created_by_id => 1 ) Translation.create( :locale => 'de', :source => "The way to communicate with us is this thing called \"Ticket\".", :target => "Der Weg um mit uns zu kommunizieren ist das sogenannte \"Ticket\".", :updated_by_id => 1, :created_by_id => 1 )
Translation.create( :locale => 'de', :source => "or", :target => "oder", :updated_by_id => 1, :created_by_id => 1 ) Translation.create( :locale => 'de', :source => "or", :target => "oder", :updated_by_id => 1, :created_by_id => 1 )
Translation.create( :locale => 'de', :source => "yes", :target => "ja", :updated_by_id => 1, :created_by_id => 1 )
Translation.create( :locale => 'de', :source => "no", :target => "nein", :updated_by_id => 1, :created_by_id => 1 )
#Translation.create( :locale => 'de', :source => "", :target => "", :updated_by_id => 1, :created_by_id => 1 ) #Translation.create( :locale => 'de', :source => "", :target => "", :updated_by_id => 1, :created_by_id => 1 )

View file

@ -0,0 +1 @@
{ "success": true }

View file

@ -0,0 +1,235 @@
/**
* QUnit v1.10.0 - A JavaScript Unit Testing Framework
*
* http://qunitjs.com
*
* Copyright 2012 jQuery Foundation and other contributors
* Released under the MIT license.
* http://jquery.org/license
*/
/** Font Family and Sizes */
#qunit-tests, #qunit-header, #qunit-banner, #qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult {
font-family: "Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial, sans-serif;
}
#qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult, #qunit-tests li { font-size: small; }
#qunit-tests { font-size: smaller; }
/** Resets */
#qunit-tests, #qunit-tests ol, #qunit-header, #qunit-banner, #qunit-userAgent, #qunit-testresult, #qunit-modulefilter {
margin: 0;
padding: 0;
}
/** Header */
#qunit-header {
padding: 0.5em 0 0.5em 1em;
color: #8699a4;
background-color: #0d3349;
font-size: 1.5em;
line-height: 1em;
font-weight: normal;
border-radius: 5px 5px 0 0;
-moz-border-radius: 5px 5px 0 0;
-webkit-border-top-right-radius: 5px;
-webkit-border-top-left-radius: 5px;
}
#qunit-header a {
text-decoration: none;
color: #c2ccd1;
}
#qunit-header a:hover,
#qunit-header a:focus {
color: #fff;
}
#qunit-testrunner-toolbar label {
display: inline-block;
padding: 0 .5em 0 .1em;
}
#qunit-banner {
height: 5px;
}
#qunit-testrunner-toolbar {
padding: 0.5em 0 0.5em 2em;
color: #5E740B;
background-color: #eee;
overflow: hidden;
}
#qunit-userAgent {
padding: 0.5em 0 0.5em 2.5em;
background-color: #2b81af;
color: #fff;
text-shadow: rgba(0, 0, 0, 0.5) 2px 2px 1px;
}
#qunit-modulefilter-container {
float: right;
}
/** Tests: Pass/Fail */
#qunit-tests {
list-style-position: inside;
}
#qunit-tests li {
padding: 0.4em 0.5em 0.4em 2.5em;
border-bottom: 1px solid #fff;
list-style-position: inside;
}
#qunit-tests.hidepass li.pass, #qunit-tests.hidepass li.running {
display: none;
}
#qunit-tests li strong {
cursor: pointer;
}
#qunit-tests li a {
padding: 0.5em;
color: #c2ccd1;
text-decoration: none;
}
#qunit-tests li a:hover,
#qunit-tests li a:focus {
color: #000;
}
#qunit-tests ol {
margin-top: 0.5em;
padding: 0.5em;
background-color: #fff;
border-radius: 5px;
-moz-border-radius: 5px;
-webkit-border-radius: 5px;
}
#qunit-tests table {
border-collapse: collapse;
margin-top: .2em;
}
#qunit-tests th {
text-align: right;
vertical-align: top;
padding: 0 .5em 0 0;
}
#qunit-tests td {
vertical-align: top;
}
#qunit-tests pre {
margin: 0;
white-space: pre-wrap;
word-wrap: break-word;
}
#qunit-tests del {
background-color: #e0f2be;
color: #374e0c;
text-decoration: none;
}
#qunit-tests ins {
background-color: #ffcaca;
color: #500;
text-decoration: none;
}
/*** Test Counts */
#qunit-tests b.counts { color: black; }
#qunit-tests b.passed { color: #5E740B; }
#qunit-tests b.failed { color: #710909; }
#qunit-tests li li {
padding: 5px;
background-color: #fff;
border-bottom: none;
list-style-position: inside;
}
/*** Passing Styles */
#qunit-tests li li.pass {
color: #3c510c;
background-color: #fff;
border-left: 10px solid #C6E746;
}
#qunit-tests .pass { color: #528CE0; background-color: #D2E0E6; }
#qunit-tests .pass .test-name { color: #366097; }
#qunit-tests .pass .test-actual,
#qunit-tests .pass .test-expected { color: #999999; }
#qunit-banner.qunit-pass { background-color: #C6E746; }
/*** Failing Styles */
#qunit-tests li li.fail {
color: #710909;
background-color: #fff;
border-left: 10px solid #EE5757;
white-space: pre;
}
#qunit-tests > li:last-child {
border-radius: 0 0 5px 5px;
-moz-border-radius: 0 0 5px 5px;
-webkit-border-bottom-right-radius: 5px;
-webkit-border-bottom-left-radius: 5px;
}
#qunit-tests .fail { color: #000000; background-color: #EE5757; }
#qunit-tests .fail .test-name,
#qunit-tests .fail .module-name { color: #000000; }
#qunit-tests .fail .test-actual { color: #EE5757; }
#qunit-tests .fail .test-expected { color: green; }
#qunit-banner.qunit-fail { background-color: #EE5757; }
/** Result */
#qunit-testresult {
padding: 0.5em 0.5em 0.5em 2.5em;
color: #2b81af;
background-color: #D2E0E6;
border-bottom: 1px solid white;
}
#qunit-testresult .module-name {
font-weight: bold;
}
/** Fixture */
#qunit-fixture {
position: absolute;
top: -10000px;
left: -10000px;
width: 1000px;
height: 1000px;
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,271 @@
// AJAX
App.Com.ajax({
type: 'GET',
url: '/assets/tests/ajax-test.json',
success: function (data) {
test( "ajax get 200", function() {
ok( true, "File found!" );
equal( data.success, true, "content parsable and ok!" );
equal( data.success2, undefined, "content parsable and ok!" );
});
},
error: function (data) {
test( "ajax", function() {
ok( false, "Failed!" );
});
}
});
// ajax queueing
App.Com.ajax({
type: 'GET',
url: '/test/wait/2',
queue: true,
success: function (data) {
test( "ajax - queue - ajax get 200 1/2", function() {
// check queue
ok( !window.testAjax, 'ajax - queue - check queue' );
window.testAjax = true;
equal( data.success, true, "ajax - queue - content parsable and ok!" );
equal( data.success2, undefined, "ajax - queue - content parsable and ok!" );
});
},
error: function (data) {
test( "ajax", function() {
ok( false, "Failed!" );
});
}
});
App.Com.ajax({
type: 'GET',
url: '/test/wait/1',
queue: true,
success: function (data) {
test( "ajax - queue - ajax get 200 2/2", function() {
// check queue
ok( window.testAjax, 'ajax - queue - check queue' )
window.testAjax = undefined;
equal( data.success, true, "content parsable and ok!" );
equal( data.success2, undefined, "content parsable and ok!" );
});
},
error: function (data) {
test( "ajax", function() {
ok( false, "Failed!" );
});
}
});
// ajax parallel
App.Com.ajax({
type: 'GET',
url: '/test/wait/2',
success: function (data) {
test( "ajax - parallel - ajax get 200 1/2", function() {
// check queue
ok( window.testAjax, 'ajax - parallel - check queue' );
window.testAjax = undefined;
equal( data.success, true, "ajax - parallel - content parsable and ok!" );
equal( data.success2, undefined, "ajax - parallel - content parsable and ok!" );
});
},
error: function (data) {
test( "ajax", function() {
ok( false, "Failed!" );
});
}
});
App.Com.ajax({
type: 'GET',
url: '/test/wait/1',
success: function (data) {
test( "ajax - parallel - ajax get 200 2/2", function() {
// check queue
ok( !window.testAjax, 'ajax - parallel - check queue' )
window.testAjax = true;
equal( data.success, true, "content parsable and ok!" );
equal( data.success2, undefined, "content parsable and ok!" );
});
},
error: function (data) {
test( "ajax", function() {
ok( false, "Failed!" );
});
}
});
// i18n
test( "i18n", function() {
// de
App.i18n.set('de');
var translated = App.i18n.translateContent('yes');
equal( translated, 'ja', 'de - yes / ja translated correctly' );
translated = App.i18n.translateContent('<test&now>//*äöüß');
equal( translated, '&lt;test&amp;now&gt;//*äöüß', 'de - <test&now>//*äöüß' );
var timestamp = App.i18n.translateTimestamp('2012-11-06T21:07:24Z');
equal( timestamp, '06.11.2012 22:07', 'de - timestamp translated correctly' );
// en
App.i18n.set('en');
translated = App.i18n.translateContent('yes');
equal( translated, 'yes', 'en - yes translated correctly' );
translated = App.i18n.translateContent('<test&now>');
equal( translated, '&lt;test&amp;now&gt;', 'en - <test&now>' );
timestamp = App.i18n.translateTimestamp('2012-11-06T21:07:24Z');
equal( timestamp, '2012-11-06 22:07', 'en - timestamp translated correctly' );
});
// events
test( "events simple", function() {
// single bind
App.Event.bind( 'test1', function(data) {
ok( true, 'event received - single bind');
equal( data.success, true, 'event received - data ok - single bind');
});
App.Event.bind( 'test2', function(data) {
ok( false, 'should not be triggered - single bind');
});
App.Event.trigger( 'test1', { success: true } );
App.Event.unbind( 'test1')
App.Event.bind( 'test1', function(data) {
ok( false, 'should not be triggered - single bind');
});
App.Event.unbind( 'test1');
App.Event.trigger( 'test1', { success: true } );
// multi bind
App.Event.bind( 'test1-1 test1-2', function(data) {
ok( true, 'event received - multi bind');
equal( data.success, true, 'event received - data ok - multi bind');
});
App.Event.bind( 'test1-3', function(data) {
ok( false, 'should not be triggered - multi bind');
});
App.Event.trigger( 'test1-2', { success: true } );
App.Event.unbind( 'test1-1')
App.Event.bind( 'test1-1', function(data) {
ok( false, 'should not be triggered - multi bind');
});
App.Event.trigger( 'test1-2', { success: true } );
});
test( "events level", function() {
// bind with level
App.Event.bind( 'test3', function(data) {
ok( false, 'should not be triggered!');
}, 'test-level' );
// unbind with level
App.Event.unbindLevel( 'test-level' );
// bind with level
App.Event.bind( 'test3', function(data) {
ok( true, 'event received');
equal( data.success, true, 'event received - data ok - level bind');
}, 'test-level' );
App.Event.trigger( 'test3', { success: true} );
});
// local store
test( "local store", function() {
var tests = [
'some 123äöüßadajsdaiosjdiaoidj',
{ key: 123 },
{ key1: { key1: [1,2,3,4] }, key2: [1,2,'äöüß'] },
];
// write/get
App.Store.clear()
_.each(tests, function(test) {
App.Store.write( 'test1', test );
var item = App.Store.get( 'test1' );
deepEqual( test, item, 'write/get - compare stored and actual data' )
});
// undefined/get
App.Store.clear()
_.each(tests, function(test) {
var item = App.Store.get( 'test1' );
deepEqual( undefined, item, 'undefined/get - compare not existing data and actual data' )
});
// write/get/delete
var tests = [
{ key: 'test1', value: 'some 123äöüßadajsdaiosjdiaoidj' },
{ key: 123, value: { a: 123, b: 'sdaad' } },
{ key: '123äöüß', value: { key1: [1,2,3,4] }, key2: [1,2,'äöüß'] },
];
App.Store.clear()
_.each(tests, function(test) {
App.Store.write( test.key, test.value );
});
_.each(tests, function(test) {
var item = App.Store.get( test.key );
deepEqual( test.value, item, 'write/get/delete - compare stored and actual data' );
App.Store.delete( test.key );
item = App.Store.get( test.key );
deepEqual( undefined, item, 'write/get/delete - compare deleted data' );
});
});
// config
test( "config", function() {
// simple
var tests = [
{ key: 'test1', value: 'some 123äöüßadajsdaiosjdiaoidj' },
{ key: 123, value: { a: 123, b: 'sdaad' } },
{ key: '123äöüß', value: { key1: [1,2,3,4] }, key2: [1,2,'äöüß'] },
];
_.each(tests, function(test) {
App.Config.set( test.key, test.value )
});
_.each(tests, function(test) {
var item = App.Config.get( test.key )
deepEqual( item, test.value, 'set/get tests' );
});
// group
var test_groups = [
{ key: 'test2', value: [ 'some 123äöüßadajsdaiosjdiaoidj' ] },
{ key: 1234, value: { a: 123, b: 'sdaad' } },
{ key: '123äöüß', value: { key1: [1,2,3,4,5,6] }, key2: [1,2,'äöüß'] },
];
var group = {};
_.each(test_groups, function(test) {
App.Config.set( test.key, test.value, 'group1' );
group[test.key] = test.value
});
// verify whole group
var item = App.Config.get( 'group1' );
deepEqual( item, group, 'group - verify group hash');
// verify each setting
_.each(test_groups, function(test) {
var item = App.Config.get( test.key, 'group1' );
deepEqual( item, test.value, 'group set/get tests' );
});
});