/* Copyright 2008-2011 Clipperz Srl This file is part of Clipperz Community Edition. Clipperz Community Edition is an online password manager. For further information about its features and functionalities please refer to http://www.clipperz.com. * Clipperz Community Edition is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. * Clipperz Community Edition 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 Clipperz Community Edition. If not, see . */ Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); var tests = { //------------------------------------------------------------------------- 'invertIndex_test': function (someTestArgs) { var testIndex; var invertedIndex; testIndex = { 'key1': 'value1', 'key2': 'value2', 'key3': 'value3', 'key4': 'value4', 'key5': 'value5' }; invertedIndex = Clipperz.PM.DataModel.User.Header.RecordIndex.invertIndex(testIndex); SimpleTest.is(MochiKit.Base.keys(invertedIndex).length, MochiKit.Base.keys(testIndex).length, "the inverted index has the same number of elements as the original index"); SimpleTest.is(invertedIndex['value1'], 'key1', "the first element has been correctly inverted"); SimpleTest.is(invertedIndex['value2'], 'key2', "the second element has been correctly inverted"); SimpleTest.is(invertedIndex['value3'], 'key3', "the third element has been correctly inverted"); SimpleTest.is(invertedIndex['value4'], 'key4', "the forth element has been correctly inverted"); SimpleTest.is(invertedIndex['value5'], 'key5', "the fifth element has been correctly inverted"); return MochiKit.Async.succeed('done'); }, //------------------------------------------------------------------------- 'joe_clipperz_offline_copy_test': function(someTestArgs) { var deferredResult; var proxy; var user; proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true}); user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); deferredResult = new Clipperz.Async.Deferred("joe_clipperz_offline_copy_test", someTestArgs); deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); deferredResult.addMethod(user, 'login'); deferredResult.addMethod(user, 'getRecords'); deferredResult.addCallback(function (someRecords) { is(someRecords.length, 20, "joe_clipperz_offline_copy_test - joe has 20 records"); }); deferredResult.addMethod(user, 'getRecords'); deferredResult.addCallback(MochiKit.Base.map, MochiKit.Base.methodcaller('label')); deferredResult.addCallback(Clipperz.Async.collectAll); deferredResult.addCallback(MochiKit.Base.methodcaller('sort')); deferredResult.addCallback(function (someSortedLabels) { SimpleTest.is(someSortedLabels.length, 20, "We got all the labels"); SimpleTest.is(someSortedLabels[0], "Amazon.com", "The first label is correct"); SimpleTest.is(someSortedLabels[1], "American Airlines", "The second label is correct"); SimpleTest.is(someSortedLabels[2], "Bloglines", "The third label is correct"); SimpleTest.is(someSortedLabels[3], "Digg", "The fourth label is correct"); SimpleTest.is(someSortedLabels[4], "Example Attack", "The fifth label is correct"); SimpleTest.is(someSortedLabels[5], "Expedia.com", "The sixth label is correct"); SimpleTest.is(someSortedLabels[6], "Google Account", "The seventh label is correct"); SimpleTest.is(someSortedLabels[7], "Home burglar alarm", "The eighth label is correct"); SimpleTest.is(someSortedLabels[8], "Jaiku", "The ninth label is correct"); SimpleTest.is(someSortedLabels[9], "LinkedIn", "The 10th label is correct"); SimpleTest.is(someSortedLabels[10], "Lufthansa", "The 11th label is correct"); SimpleTest.is(someSortedLabels[11], "Microsoft Office CD Key", "The 12th label is correct"); SimpleTest.is(someSortedLabels[12], "MyBlogLog", "The 13th label is correct"); SimpleTest.is(someSortedLabels[13], "MySpace", "The 14th label is correct"); SimpleTest.is(someSortedLabels[14], "SAP - Login", "The 15th label is correct"); SimpleTest.is(someSortedLabels[15], "The New York Times", "The 16th label is correct"); SimpleTest.is(someSortedLabels[16], "Web password", "The 17th label is correct"); SimpleTest.is(someSortedLabels[17], "Web password", "The 18th label is correct"); SimpleTest.is(someSortedLabels[18], "Yahoo! Account", "The 19th label is correct"); SimpleTest.is(someSortedLabels[19], "del.icio.us", "The 20th label is correct"); }); deferredResult.callback(); return deferredResult; }, //------------------------------------------------------------------------- 'joe_clipperz_offline_copy_getDirectLogins_test': function(someTestArgs) { var deferredResult; var proxy; var user; proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true}); user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); deferredResult = new Clipperz.Async.Deferred("joe_clipperz_offline_copy_getDirectLogins_test", someTestArgs); deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); deferredResult.addMethod(user, 'login'); deferredResult.addMethod(user, 'getDirectLogins'); deferredResult.addCallback(function (someDirectLogins) { SimpleTest.is(someDirectLogins.length, 22, "joe has 22 direct logins"); }); deferredResult.addMethod(user, 'getDirectLogins'); deferredResult.addCallback(MochiKit.Base.map, MochiKit.Base.methodcaller('label')); deferredResult.addCallback(Clipperz.Async.collectAll); deferredResult.addCallback(MochiKit.Base.methodcaller('sort')); deferredResult.addCallback(function (someSortedLabels) { SimpleTest.is(someSortedLabels.length, 22, "We got all the labels"); SimpleTest.is(someSortedLabels[0], "Amazon.com", "The first label is correct"); SimpleTest.is(someSortedLabels[1], "American Airlines", "The second label is correct"); SimpleTest.is(someSortedLabels[2], "Bloglines", "The third label is correct"); SimpleTest.is(someSortedLabels[3], "Digg", "The fourth label is correct"); SimpleTest.is(someSortedLabels[4], "Example Attack", "The 5th label is correct"); SimpleTest.is(someSortedLabels[5], "Expedia.com", "The 6th label is correct"); SimpleTest.is(someSortedLabels[6], "Flickr", "The 7th label is correct"); SimpleTest.is(someSortedLabels[7], "Google Account", "The 8th label is correct"); SimpleTest.is(someSortedLabels[8], "Google Calendar", "The 9th label is correct"); SimpleTest.is(someSortedLabels[9], "Google Docs", "The 10th label is correct"); SimpleTest.is(someSortedLabels[10], "Google Mail", "The 11th label is correct"); SimpleTest.is(someSortedLabels[11], "Jaiku", "The 12th label is correct"); SimpleTest.is(someSortedLabels[12], "LinkedIn", "The 13th label is correct"); SimpleTest.is(someSortedLabels[13], "Lufthansa", "The 14th label is correct"); SimpleTest.is(someSortedLabels[14], "My Yahoo!", "The 15th label is correct"); SimpleTest.is(someSortedLabels[15], "MyBlogLog", "The 16th label is correct"); SimpleTest.is(someSortedLabels[16], "MySpace", "The 17th label is correct"); SimpleTest.is(someSortedLabels[17], "SAP - Login", "The 18th label is correct"); SimpleTest.is(someSortedLabels[18], "SAP - Login", "The 19th label is correct"); SimpleTest.is(someSortedLabels[19], "The New York Times", "The 20th label is correct"); SimpleTest.is(someSortedLabels[20], "Yahoo! Groups", "The 21st label is correct"); SimpleTest.is(someSortedLabels[21], "Yahoo! Mail", "The 22nd label is correct"); }); deferredResult.callback(); return deferredResult; }, //------------------------------------------------------------------------- 'getCredentials_test': function (someTestArgs) { var deferredResult; var user; user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); deferredResult = new Clipperz.Async.Deferred("getCredentials_test", someTestArgs); deferredResult.addMethod(user, 'getCredentials'); deferredResult.addCallback(function(aResult) { SimpleTest.is(aResult.username, 'joe', "the username of the credentaials is correct"); SimpleTest.is(aResult.password, 'clipperz', "the password of the credentaials is correct"); }) deferredResult.callback(); return deferredResult; }, //------------------------------------------------------------------------- 'loginWithOfflineData_test': function (someTestArgs) { var deferredResult; var user; var proxy; proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true}); user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); deferredResult = new Clipperz.Async.Deferred("loginWithOfflineData_test", someTestArgs); deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); deferredResult.addMethod(user, 'login'); deferredResult.addCallback(function(aResult) { SimpleTest.is(aResult.result, 'done', "successfully logged in"); }) deferredResult.callback(); return deferredResult; }, //------------------------------------------------------------------------- 'getRecords_fromOfflineData_OLD_test': function (someTestArgs) { var deferredResult; var user; var proxy; proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true}); user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); deferredResult = new Clipperz.Async.Deferred("getRecords_fromOfflineData_OLD_test", someTestArgs); deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['OLD_joe_clipperz_offline_copy_data']); deferredResult.addMethod(user, 'login'); deferredResult.addCallback(function(aResult) { SimpleTest.is(aResult.result, 'done', "successfully logged in"); }); deferredResult.addMethod(user, 'getRecords'); deferredResult.addCallback(function(someRecords) { SimpleTest.is(someRecords.length, 15, "the OLD test user has just 15 records"); }); deferredResult.addMethod(user, 'getRecords'); deferredResult.addCallback(MochiKit.Base.map, MochiKit.Base.methodcaller('label')); deferredResult.addCallback(Clipperz.Async.collectAll); deferredResult.addCallback(MochiKit.Base.methodcaller('sort')); deferredResult.addCallback(function (someSortedLabels) { SimpleTest.is(someSortedLabels.length, 15, "We got all the labels"); SimpleTest.is(someSortedLabels[0], "Amazon.com", "The first label is correct"); SimpleTest.is(someSortedLabels[1], "American Airlines", "The second label is correct"); SimpleTest.is(someSortedLabels[2], "Bloglines", "The third label is correct"); SimpleTest.is(someSortedLabels[3], "Digg", "The fourth label is correct"); SimpleTest.is(someSortedLabels[4], "Expedia.com", "The fifth label is correct"); SimpleTest.is(someSortedLabels[5], "Google Account", "The sixth label is correct"); SimpleTest.is(someSortedLabels[6], "Home burglar alarm","The seventh label is correct"); }); /* */ deferredResult.callback(); return deferredResult; }, //------------------------------------------------------------------------- 'getDirectLogins_fromOfflineData_OLD_test': function (someTestArgs) { var deferredResult; var user; var proxy; proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true}); user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); deferredResult = new Clipperz.Async.Deferred("getRecords_fromOfflineData_OLD_test", someTestArgs); deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['OLD_joe_clipperz_offline_copy_data']); deferredResult.addMethod(user, 'login'); deferredResult.addCallback(function(aResult) { SimpleTest.is(aResult.result, 'done', "successfully logged in"); }); deferredResult.addMethod(user, 'getDirectLogins'); deferredResult.addCallback(function(someDirectLogins) { SimpleTest.is(someDirectLogins.length, 17, "the OLD test user has 17 direct logins"); }); deferredResult.addMethod(user, 'getDirectLogins'); deferredResult.addCallback(MochiKit.Base.map, MochiKit.Base.methodcaller('label')); deferredResult.addCallback(Clipperz.Async.collectAll); deferredResult.addCallback(MochiKit.Base.methodcaller('sort')); deferredResult.addCallback(function (someSortedLabels) { SimpleTest.is(someSortedLabels.length, 17, "We got all the labels"); SimpleTest.is(someSortedLabels[0], "Amazon.com", "The first label is correct"); SimpleTest.is(someSortedLabels[1], "American Airlines", "The second label is correct"); SimpleTest.is(someSortedLabels[2], "Bloglines", "The third label is correct"); SimpleTest.is(someSortedLabels[3], "Digg", "The fourth label is correct"); SimpleTest.is(someSortedLabels[4], "Expedia.com", "The fifth label is correct"); SimpleTest.is(someSortedLabels[5], "Flickr", "The sixth label is correct"); SimpleTest.is(someSortedLabels[6], "Google Calendar", "The seventh label is correct"); SimpleTest.is(someSortedLabels[7], "Google Docs", "The 8th label is correct"); SimpleTest.is(someSortedLabels[8], "Google Mail", "The 9th label is correct"); SimpleTest.is(someSortedLabels[9], "LinkedIn", "The 10th label is correct"); SimpleTest.is(someSortedLabels[10], "Lufthansa", "The 11th label is correct"); SimpleTest.is(someSortedLabels[11], "My Yahoo!", "The 12th label is correct"); SimpleTest.is(someSortedLabels[12], "MyBlogLog", "The 13th label is correct"); SimpleTest.is(someSortedLabels[13], "MySpace", "The 14th label is correct"); SimpleTest.is(someSortedLabels[14], "The New York Times", "The 15th label is correct"); SimpleTest.is(someSortedLabels[15], "Yahoo! Groups", "The 16th label is correct"); SimpleTest.is(someSortedLabels[16], "Yahoo! Mail", "The 17th label is correct"); }); deferredResult.callback(); return deferredResult; }, //------------------------------------------------------------------------- 'sortRecords_test': function (someTestArgs) { var deferredResult; var proxy; var user; var caseInsensitiveCompare; caseInsensitiveCompare = function (aValue, bValue) { return MochiKit.Base.compare(aValue.toLowerCase(), bValue.toLowerCase()); }; proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true}); user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); deferredResult = new Clipperz.Async.Deferred("sortRecords_test", someTestArgs); deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); deferredResult.addMethod(user, 'login'); deferredResult.addMethod(user, 'getRecords'); deferredResult.addCallback(Clipperz.Async.deferredSort, function (aRecord, bRecord) { return Clipperz.Async.deferredCompare(MochiKit.Base.compare, aRecord.label(), bRecord.label()); }); deferredResult.addCallback(MochiKit.Base.itemgetter('0')); deferredResult.addCallback(MochiKit.Base.methodcaller('label')); deferredResult.addTest("Amazon.com", "Sorting the records themselves (by labels), the first one is 'Amazon.com'"); deferredResult.addMethod(user, 'getRecords'); deferredResult.addCallback(Clipperz.Async.deferredSort, function (aRecord, bRecord) { return Clipperz.Async.deferredCompare(MochiKit.Base.compare, aRecord.label(), bRecord.label()); }); deferredResult.addCallback(MochiKit.Base.itemgetter('5')); deferredResult.addCallback(MochiKit.Base.methodcaller('label')); deferredResult.addTest("Expedia.com", "Sorting the records themselves (by labels), the sixth element is 'Expedia.com'"); deferredResult.addMethod(user, 'getRecords'); deferredResult.addCallback(Clipperz.Async.deferredSort, function (aRecord, bRecord) { return Clipperz.Async.deferredCompare(MochiKit.Base.compare, aRecord.label(), bRecord.label()); }); deferredResult.addCallback(MochiKit.Base.itemgetter('19')); deferredResult.addCallback(MochiKit.Base.methodcaller('label')); deferredResult.addTest("del.icio.us", "Sorting the records themselves (by labels), the 20th element is 'del.icio.us'"); deferredResult.addMethod(user, 'getRecords'); deferredResult.addCallback(Clipperz.Async.deferredSort, function (aRecord, bRecord) { return Clipperz.Async.deferredCompare(caseInsensitiveCompare, aRecord.label(), bRecord.label()); }); deferredResult.addCallback(MochiKit.Base.itemgetter('3')); deferredResult.addCallback(MochiKit.Base.methodcaller('label')); deferredResult.addTest("del.icio.us", "Sorting with case insensitive mode (by labels), the fourth record is 'del.ico.us'"); deferredResult.addMethod(user, 'getRecords'); deferredResult.addCallback(Clipperz.Async.deferredSort, function (aRecord, bRecord) { return Clipperz.Async.deferredCompare(caseInsensitiveCompare, aRecord.label(), bRecord.label()); }); deferredResult.addCallback(MochiKit.Base.itemgetter('19')); deferredResult.addCallback(MochiKit.Base.methodcaller('label')); deferredResult.addTest("Yahoo! Account", "Sorting with case insensitive mode (by labels), the 20th record is 'Yahoo! Account'"); deferredResult.callback(); return deferredResult; }, //------------------------------------------------------------------------- 'accessToSingleRecord_test': function (someTestArgs) { var deferredResult; var proxy; var user; proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true}); user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); deferredResult = new Clipperz.Async.Deferred("sortRecords_test", someTestArgs); deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); deferredResult.addMethod(user, 'login'); deferredResult.addMethod(user, 'getRecord', '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551'); deferredResult.addCallback(MochiKit.Base.methodcaller('label')); deferredResult.addTest("Amazon.com", "Sorting the records themselves (by labels), the first one is 'Amazon.com'"); deferredResult.callback(); return deferredResult; }, //------------------------------------------------------------------------- 'accessToSingleRecordContent_test': function (someTestArgs) { var deferredResult; var proxy; var user; proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true}); user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); deferredResult = new Clipperz.Async.Deferred("sortRecords_test", someTestArgs); deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); deferredResult.addMethod(user, 'login'); deferredResult.addMethod(user, 'getRecord', '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551'); deferredResult.addCallback(MochiKit.Base.methodcaller('fields')); deferredResult.addCallback(function (someRecordFields) { SimpleTest.is(MochiKit.Base.keys(someRecordFields).length, 2, "The number of fields of the Amazon.com record matches"); return someRecordFields; }); deferredResult.addCallback(MochiKit.Base.itemgetter('5e822c34aaf1a9fbc0b52585c1915f3a3758abd51923a4d35ae85373bbb839c2')); deferredResult.collectResults({ 'label': MochiKit.Base.methodcaller('label'), 'value': MochiKit.Base.methodcaller('value') }) deferredResult.addCallback(function (someValues) { SimpleTest.is(someValues['label'], 'email', "the first field label matches"); SimpleTest.is(someValues['value'], 'joe@clipperz.com', "the first field value matches"); }); deferredResult.callback(); return deferredResult; }, //------------------------------------------------------------------------- 'modifyRecordLabelAndCheckForPendingChanges_test': function (someTestArgs) { var deferredResult; var proxy; var user; proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true}); user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); deferredResult = new Clipperz.Async.Deferred("modifyRecordAndCheckForPendingChanges_test", someTestArgs); deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); deferredResult.addMethod(user, 'login'); deferredResult.addMethod(user, 'getRecord', '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551'); deferredResult.addCallback(MochiKit.Base.methodcaller('label')); deferredResult.addTest("Amazon.com", "This is the record the test was expecting"); deferredResult.addMethod(user, 'getRecord', '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551'); deferredResult.addCallback(MochiKit.Base.methodcaller('setLabel', "New label")); deferredResult.addMethod(user, 'hasPendingChanges'); deferredResult.addTest(true, "setting a label on one of the user's record, trigger the 'hasPendingChanges' flag"); deferredResult.addMethod(user, 'getRecord', '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551'); deferredResult.addCallback(MochiKit.Base.methodcaller('label')); deferredResult.addTest("New label", "once set the new label value, I can still get back its value"); deferredResult.addMethod(user, 'revertChanges'); deferredResult.addMethod(user, 'hasPendingChanges'); deferredResult.addTest(false, "reverting changes should return to the original state"); deferredResult.addMethod(user, 'getRecord', '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551'); deferredResult.addCallback(MochiKit.Base.methodcaller('label')); deferredResult.addTest("Amazon.com", "The label of the record is restored to its initial value"); deferredResult.callback(); return deferredResult; }, //------------------------------------------------------------------------- 'modifyRecordFieldsAndCheckForPendingChanges_test': function (someTestArgs) { var deferredResult; var proxy; var user; proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true}); user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); deferredResult = new Clipperz.Async.Deferred("modifyRecordFieldsAndCheckForPendingChanges_test", someTestArgs); deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); deferredResult.addMethod(user, 'login'); deferredResult.addMethod(user, 'getRecord', '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551'); deferredResult.addCallback(MochiKit.Base.methodcaller('fields')); deferredResult.addCallback(MochiKit.Base.itemgetter('5e822c34aaf1a9fbc0b52585c1915f3a3758abd51923a4d35ae85373bbb839c2')); deferredResult.addCallback(MochiKit.Base.methodcaller('value')); deferredResult.addTest("joe@clipperz.com", "The value of the record field is correct"); deferredResult.addMethod(user, 'getRecord', '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551'); deferredResult.addCallback(MochiKit.Base.methodcaller('fields')); deferredResult.addCallback(MochiKit.Base.itemgetter('5e822c34aaf1a9fbc0b52585c1915f3a3758abd51923a4d35ae85373bbb839c2')); deferredResult.addCallback(MochiKit.Base.methodcaller('setValue', 'joe@example.com')); deferredResult.addMethod(user, 'getRecord', '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551'); deferredResult.addCallback(MochiKit.Base.methodcaller('fields')); deferredResult.addCallback(MochiKit.Base.itemgetter('5e822c34aaf1a9fbc0b52585c1915f3a3758abd51923a4d35ae85373bbb839c2')); deferredResult.addCallback(MochiKit.Base.methodcaller('value')); deferredResult.addTest("joe@example.com", "The record field correctly returns the newly updated value"); deferredResult.addMethod(user, 'hasPendingChanges'); deferredResult.addTest(true, "changing the value of a record's field trigger the 'hasPendingChanges' flag"); deferredResult.addMethod(user, 'revertChanges'); deferredResult.addMethod(user, 'hasPendingChanges'); deferredResult.addTest(false, "reverting changes should return to the original state"); deferredResult.addMethod(user, 'getRecord', '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551'); deferredResult.addCallback(MochiKit.Base.methodcaller('fields')); deferredResult.addCallback(MochiKit.Base.itemgetter('5e822c34aaf1a9fbc0b52585c1915f3a3758abd51923a4d35ae85373bbb839c2')); deferredResult.addCallback(MochiKit.Base.methodcaller('value')); deferredResult.addTest("joe@clipperz.com", "The original value of the record field is returned after reverting the changes"); deferredResult.callback(); return deferredResult; }, //------------------------------------------------------------------------- 'modifyRecordNoteAndCheckForPendingChanges_test': function (someTestArgs) { var deferredResult; var proxy; var user; proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true}); user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); deferredResult = new Clipperz.Async.Deferred("modifyRecordNoteAndCheckForPendingChanges_test", someTestArgs); deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); deferredResult.addMethod(user, 'login'); deferredResult.addMethod(user, 'getRecord', '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d'); deferredResult.addCallback(MochiKit.Base.methodcaller('notes')); deferredResult.addTest("aproofofconcept\n", "The value of the record note is correct"); deferredResult.addMethod(user, 'getRecord', '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d'); deferredResult.addCallback(MochiKit.Base.methodcaller('setNotes', "A new note text")); deferredResult.addMethod(user, 'getRecord', '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d'); deferredResult.addCallback(MochiKit.Base.methodcaller('notes')); deferredResult.addTest("A new note text", "The value of the record note has been updated"); deferredResult.addMethod(user, 'hasPendingChanges'); deferredResult.addTest(true, "changing the value of record's notes trigger the 'hasPendingChanges' flag"); deferredResult.addMethod(user, 'getRecord', '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d'); deferredResult.addCallback(MochiKit.Base.methodcaller('hasPendingChanges')); deferredResult.addTest(true, "also the record should flat its pending changes on the note field"); deferredResult.addMethod(user, 'revertChanges'); deferredResult.addMethod(user, 'hasPendingChanges'); deferredResult.addTest(false, "reverting changes should return to the original state"); deferredResult.addMethod(user, 'getRecord', '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d'); deferredResult.addCallback(MochiKit.Base.methodcaller('notes')); deferredResult.addTest("aproofofconcept\n", "The value of the record note is restored to its initial value"); deferredResult.callback(); return deferredResult; }, //------------------------------------------------------------------------- 'loadUser_withoutPreferences_andTryToAccessThem_test': function (someTestArgs) { var deferredResult; var proxy; var user; proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true}); user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); deferredResult = new Clipperz.Async.Deferred("loadUser_withoutPreferences_andTryToAccessThem_test", someTestArgs); deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']); deferredResult.addMethod(user, 'login'); deferredResult.collectResults({ 'preferences': [ MochiKit.Base.method(user, 'getHeaderIndex', 'preferences'), MochiKit.Base.methodcaller('getDecryptedData') ], 'oneTimePasswords': [ MochiKit.Base.method(user, 'getHeaderIndex', 'oneTimePasswords'), MochiKit.Base.methodcaller('getDecryptedData') ] }); deferredResult.addCallback(function (someValues) { SimpleTest.is(Clipperz.Base.serializeJSON(someValues['preferences']), '{}', "The preferences are empty"); }); deferredResult.callback(); return deferredResult; }, //------------------------------------------------------------------------- 'modifyRecordTitleAndCheckForPendingChanges_test': function (someTestArgs) { var deferredResult; var proxy; var user; proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true}); user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); deferredResult = new Clipperz.Async.Deferred("modifyRecordTitleAndCheckForPendingChanges_test", someTestArgs); deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']); deferredResult.addMethod(user, 'login'); deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); deferredResult.addCallback(MochiKit.Base.methodcaller('label')); deferredResult.addTest("Card 1", "The value of the record note is correct"); deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); deferredResult.addCallback(MochiKit.Base.methodcaller('setLabel', "Edited card 1")); deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); deferredResult.addCallback(MochiKit.Base.methodcaller('label')); deferredResult.addTest("Edited card 1", "The value of the record label has been updated"); deferredResult.addMethod(user, 'hasPendingChanges'); deferredResult.addTest(true, "changing the value of record's label trigger the 'hasPendingChanges' flag"); deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); deferredResult.addCallback(MochiKit.Base.methodcaller('hasPendingChanges')); // deferredResult.addTest(true, "also the record should flag its pending changes on the label - 1"); deferredResult.addTest(false, "changing just the label (or any other attribute stored on the header) should not trigger the 'hasPendingChanges' flag"); deferredResult.addMethod(user, 'revertChanges'); deferredResult.addMethod(user, 'hasPendingChanges'); deferredResult.addTest(false, "reverting changes should return to the original state"); deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); deferredResult.addCallback(MochiKit.Base.methodcaller('label')); deferredResult.addTest("Card 1", "The value of the record label is restored to its initial value"); deferredResult.callback(); return deferredResult; }, //------------------------------------------------------------------------- 'modifyRecordTitleAndCheckForPendingChanges_take2_test': function (someTestArgs) { var deferredResult; var proxy; var user; proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true}); user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); deferredResult = new Clipperz.Async.Deferred("modifyRecordTitleAndCheckForPendingChanges_take2_test", someTestArgs); deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']); deferredResult.addMethod(user, 'login'); deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); deferredResult.addCallback(MochiKit.Base.methodcaller('label')); deferredResult.addTest("Card 1", "The value of the record note is correct"); deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); deferredResult.addCallback(MochiKit.Base.methodcaller('setLabel', "Edited card 1")); deferredResult.addMethod(user, 'hasPendingChanges'); deferredResult.addTest(true, "changing the value of record's label trigger the 'hasPendingChanges' flag"); deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); deferredResult.addCallback(MochiKit.Base.methodcaller('hasPendingChanges')); // deferredResult.addTest(true, "also the record should flag its pending changes on the label - 2"); deferredResult.addTest(false, "only the label has changed, and this should not trigger the 'hasPendingChanges' flag on the record as it is stored in the header"); // deferredResult.addCallback(Clipperz.log, "======================================================="); deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); deferredResult.addCallback(MochiKit.Base.methodcaller('setLabel', "Card 1")); deferredResult.addMethod(user, 'hasPendingChanges'); deferredResult.addTest(false, "Setting the old value back should void all pending changes"); deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); deferredResult.addCallback(MochiKit.Base.methodcaller('hasPendingChanges')); deferredResult.addTest(false, "also the record should not flag any pending changes, as the original value has been restored"); deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); deferredResult.addCallback(MochiKit.Base.methodcaller('label')); deferredResult.addTest("Card 1", "The value of the record label is restored to its initial value"); deferredResult.callback(); return deferredResult; }, //------------------------------------------------------------------------- 'modifyRecordNoteAndThanResetOriginalValue_test': function (someTestArgs) { var deferredResult; var proxy; var user; proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true}); user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); deferredResult = new Clipperz.Async.Deferred("modifyRecordNoteAndThanResetOriginalValue_test", someTestArgs); deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); deferredResult.addMethod(user, 'login'); deferredResult.addMethod(user, 'getRecord', '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d'); deferredResult.addCallback(MochiKit.Base.methodcaller('notes')); deferredResult.addTest("aproofofconcept\n", "The value of the record note is correct"); deferredResult.addMethod(user, 'getRecord', '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d'); deferredResult.addCallback(MochiKit.Base.methodcaller('setNotes', "A new note text")); deferredResult.addMethod(user, 'hasPendingChanges'); deferredResult.addTest(true, "changing the value of record's notes trigger the 'hasPendingChanges' flag"); deferredResult.addMethod(user, 'getRecord', '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d'); deferredResult.addCallback(MochiKit.Base.methodcaller('setNotes', "aproofofconcept\n")); deferredResult.addMethod(user, 'hasPendingChanges'); deferredResult.addTest(false, "setting the field to its original value basically reset the change, like 'revertChanges' would have done"); deferredResult.callback(); return deferredResult; }, //------------------------------------------------------------------------- 'modifyRecordNoteAndCommitChanges_test': function (someTestArgs) { var deferredResult; var proxy; var user; var user2; var newNoteText; proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); user2 = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); newNoteText = "A new note text"; deferredResult = new Clipperz.Async.Deferred("modifyRecordAndCommitChanges_test", someTestArgs); deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']); deferredResult.addMethod(user, 'login'); deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); deferredResult.addCallback(MochiKit.Base.methodcaller('notes')); deferredResult.addTest("", "This is the original value of the notes"); deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); deferredResult.addCallback(MochiKit.Base.methodcaller('setNotes', newNoteText)); deferredResult.addMethod(user, 'hasPendingChanges'); deferredResult.addTest(true, "changing the value of record's notes trigger the 'hasPendingChanges' flag"); deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); deferredResult.addCallback(MochiKit.Base.methodcaller('hasPendingChanges')); deferredResult.addTest(true, "changing the value of record's notes trigger the 'hasPendingChanges' flag also on the record itself"); deferredResult.addMethod(user, 'saveChanges'); deferredResult.addMethod(user, 'hasPendingChanges'); deferredResult.addTest(false, "saving changes should return the user to a state with not changes pending - 1"); deferredResult.addMethod(user2, 'login'); deferredResult.addMethod(user2, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); deferredResult.addCallback(MochiKit.Base.methodcaller('notes')); deferredResult.addTest(newNoteText, "It looks like the data edited was correctly stored and reloaded here"); deferredResult.callback(); return deferredResult; }, //------------------------------------------------------------------------- 'multipleModificationToRecordTitleAndCommitChanges_test': function (someTestArgs) { var deferredResult; var proxy; var user; var user2; var user3; var newRecordTitle; proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); user2 = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); user3 = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); newRecordTitle = "A nice new title here"; deferredResult = new Clipperz.Async.Deferred("multipleModificationToRecordTitleAndCommitChanges_test", someTestArgs); deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']); deferredResult.addMethod(user, 'login'); deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); deferredResult.addCallback(MochiKit.Base.methodcaller('label')); deferredResult.addTest("Card 1", "This is the original value of the label"); deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); deferredResult.addCallback(MochiKit.Base.methodcaller('setLabel', newRecordTitle)); deferredResult.addMethod(user, 'hasPendingChanges'); deferredResult.addTest(true, "changing the value of record's label trigger the 'hasPendingChanges' flag"); deferredResult.addMethod(user, 'saveChanges'); deferredResult.addMethod(user, 'hasPendingChanges'); deferredResult.addTest(false, "saving changes should return the user to a state with not changes pending - 2"); // FAIL deferredResult.addMethod(user2, 'login'); deferredResult.addMethod(user2, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); deferredResult.addCallback(MochiKit.Base.methodcaller('label')); deferredResult.addTest(newRecordTitle, "It looks like the label edited was correctly stored and reloaded here"); deferredResult.addMethod(user2, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); deferredResult.addCallback(MochiKit.Base.methodcaller('setLabel', newRecordTitle + "-" + newRecordTitle)); deferredResult.addMethod(user2, 'hasPendingChanges'); deferredResult.addTest(true, "changing again the value of record's label trigger the 'hasPendingChanges' flag also on the new user"); deferredResult.addMethod(user2, 'saveChanges'); deferredResult.addMethod(user2, 'hasPendingChanges'); deferredResult.addTest(false, "after committing the changes, the user has no pending changes"); // FAIL deferredResult.addMethod(user3, 'login'); deferredResult.addMethod(user3, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); deferredResult.addCallback(MochiKit.Base.methodcaller('label')); deferredResult.addTest(newRecordTitle + "-" + newRecordTitle, "It looks like the label edited was correctly stored and reloaded here"); deferredResult.callback(); return deferredResult; }, //------------------------------------------------------------------------- 'saveChangesWithADeletedRecord_test': function (someTestArgs) { var deferredResult; var proxy; var user; proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); deferredResult = new Clipperz.Async.Deferred("saveChangesWithADeletedRecord_test", someTestArgs); deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']); deferredResult.addMethod(user, 'login'); deferredResult.addMethod(user, 'getRecords'); deferredResult.addCallback(MochiKit.Base.itemgetter('length')); deferredResult.addTest(1, "This account has oly a single card"); deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); deferredResult.addCallback(MochiKit.Base.methodcaller('label')); deferredResult.addTest("Card 1", "This is the initial value of the label ..."); deferredResult.addMethod(user, 'getHeaderIndex', 'recordsIndex'); deferredResult.addCallback(MochiKit.Base.methodcaller('prepareRemoteDataForChangedRecords')); deferredResult.addCallback(function (aResult) { SimpleTest.ok(aResult['updated'] != null, "There updated key is not null"); SimpleTest.isDeeply(aResult['updated'], [], "There are no updated cards"); SimpleTest.ok(aResult['deleted'] != null, "There deleted key is not null"); SimpleTest.isDeeply(aResult['deleted'], [], "There are no deleted references"); return aResult; }) deferredResult.addMethod(user, 'revertChanges'); deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); deferredResult.addMethod(user, 'deleteRecord'); deferredResult.addMethod(user, 'getHeaderIndex', 'recordsIndex'); deferredResult.addCallback(MochiKit.Base.methodcaller('prepareRemoteDataForChangedRecords')); deferredResult.addCallback(function (aResult) { SimpleTest.isDeeply(aResult['deleted'], ['8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'], "The deleted record reference is correctly reported"); return aResult; }) deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); deferredResult.shouldFail("accessing the deleted record reference should raise an exception"); deferredResult.addMethod(user, 'getRecord', '0000000000000000000000000000000000000000000000000000000000000000'); deferredResult.shouldFail("accessing a fake record reference should raise an exception"); deferredResult.addMethod(user, 'saveChanges'); deferredResult.addMethod(user, 'getRecords'); deferredResult.addCallback(MochiKit.Base.itemgetter('length')); deferredResult.addTest(0, "after deleting the only record, there should be no records bound to the user"); deferredResult.callback(); return deferredResult; }, //------------------------------------------------------------------------- 'revertingChangesAfterDeletingACard_test': function (someTestArgs) { var deferredResult; var proxy; var user; proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); deferredResult = new Clipperz.Async.Deferred("simpleSaveChanges_test", someTestArgs); deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']); deferredResult.addMethod(user, 'login'); deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); deferredResult.addCallback(MochiKit.Base.methodcaller('label')); deferredResult.addTest("Card 1", "This is the initial value of the label ..."); deferredResult.addMethod(user, 'getHeaderIndex', 'recordsIndex'); deferredResult.addCallback(MochiKit.Base.methodcaller('prepareRemoteDataForChangedRecords')); deferredResult.addCallback(function (aResult) { SimpleTest.ok(aResult['updated'] != null, "There updated key is not null"); SimpleTest.isDeeply(aResult['updated'], [], "There are no updated cards"); SimpleTest.ok(aResult['deleted'] != null, "There deleted key is not null"); SimpleTest.isDeeply(aResult['deleted'], [], "There are no deleted references"); return aResult; }) deferredResult.addMethod(user, 'revertChanges'); deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); deferredResult.addMethod(user, 'deleteRecord'); deferredResult.addMethod(user, 'getHeaderIndex', 'recordsIndex'); deferredResult.addCallback(MochiKit.Base.methodcaller('prepareRemoteDataForChangedRecords')); deferredResult.addCallback(function (aResult) { SimpleTest.isDeeply(aResult['deleted'], ['8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'], "The deleted record reference is correctly reported"); return aResult; }) deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); deferredResult.shouldFail("accessing the deleted record reference should raise an exception"); deferredResult.addMethod(user, 'getRecord', '0000000000000000000000000000000000000000000000000000000000000000'); deferredResult.shouldFail("accessing a fake record reference should raise an exception"); deferredResult.addMethod(user, 'revertChanges'); deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); deferredResult.addCallback(SimpleTest.ok, true, "after reverting all changes, the deleted card is restored"); deferredResult.callback(); return deferredResult; }, //------------------------------------------------------------------------- 'lockUnlockAccountAfterDeletingACard_test': function (someTestArgs) { var deferredResult; var proxy; var user; var recordID; proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); recordID = 'eeda70e0392261967bda71c3764da78989c45bbd2bb7be6b941b90f81d9b81b5'; // recordID = '507f38b06d587d8889698ae1ebbba7ef8f0539b82550dd25779fd9ee88fc0c7a'; deferredResult = new Clipperz.Async.Deferred("lockUnlockAccountAfterDeletingACard_test", someTestArgs); deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); deferredResult.addMethod(user, 'login'); deferredResult.addMethod(user, 'getRecords'); deferredResult.addCallback(MochiKit.Base.itemgetter('length')); deferredResult.addTest(20, "Initially the user has 20 cards"); deferredResult.addMethod(user, 'getDirectLogins'); deferredResult.addCallback(MochiKit.Base.itemgetter('length')); deferredResult.addTest(22, "Initially the user has 22 direct logins"); deferredResult.addMethod(user, 'getHeaderIndex', 'recordsIndex'); deferredResult.addMethodcaller('directLoginsData'); deferredResult.addMethodcaller('values'); deferredResult.addCallback(MochiKit.Base.values); deferredResult.addCallback(MochiKit.Base.itemgetter('length')); deferredResult.addTest(22, "There should be also 22 direct login references"); deferredResult.addMethod(user, 'getRecord', recordID); deferredResult.addMethodcaller('directLogins'); deferredResult.addCallback(MochiKit.Base.values); deferredResult.addCallback(MochiKit.Base.itemgetter('length')); deferredResult.addTest(4, "The selected record has 4 direct logins"); deferredResult.addMethod(user, 'getRecord', recordID); deferredResult.addMethod(user, 'deleteRecord'); deferredResult.addMethod(user, 'saveChanges'); deferredResult.addMethod(user, 'hasAnyCleanTextData'); deferredResult.addTest(true, "after saving changes, hasAnyCleanTextData should be true"); deferredResult.addMethod(user, 'deleteAllCleanTextData'); deferredResult.addMethod(user, 'hasAnyCleanTextData'); deferredResult.addTest(false, "after deleting all clean text data, hasAnyCleanTextData should be true"); deferredResult.addMethod(user, 'login'); deferredResult.addMethod(user, 'getRecords'); deferredResult.addCallback(MochiKit.Base.itemgetter('length')); deferredResult.addTest((20 - 1), "After deleting a card, only 19 are left"); deferredResult.addMethod(user, 'getDirectLogins'); deferredResult.addCallback(MochiKit.Base.itemgetter('length')); deferredResult.addTest((22 - 4), "Initially the user has 18 direct logins"); deferredResult.addMethod(user, 'getHeaderIndex', 'recordsIndex'); deferredResult.addMethodcaller('directLoginsData'); deferredResult.addMethodcaller('values'); deferredResult.addCallback(MochiKit.Base.values); deferredResult.addCallback(MochiKit.Base.itemgetter('length')); deferredResult.addTest((22 - 4), "Once deleted the card, there should be just 18 direct login references left"); deferredResult.addCallback(function () { SimpleTest.ok(true, "nothing wrong had happen 'till here"); }); deferredResult.callback(); return deferredResult; }, //------------------------------------------------------------------------- 'lockUnlockAccountAfterDeletingACard_2_test': function (someTestArgs) { var deferredResult; var proxy; var user; proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); deferredResult = new Clipperz.Async.Deferred("lockUnlockAccountAfterDeletingACard_2_test", someTestArgs); deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); deferredResult.addMethod(user, 'login'); deferredResult.addMethod(user, 'getRecords'); deferredResult.addCallback(function (someRecords) { SimpleTest.is(someRecords.length, 20, "Initially the user has 20 cards"); }); deferredResult.addMethod(user, 'getDirectLogins'); deferredResult.addCallback(function (someDirectLogins) { SimpleTest.is(someDirectLogins.length, 22, "Initially the user has 42 direct logins"); }); deferredResult.addMethod(user, 'getHeaderIndex', 'recordsIndex'); deferredResult.addMethodcaller('directLoginsData'); deferredResult.addMethodcaller('values'); deferredResult.addCallback(MochiKit.Base.values); deferredResult.addCallback(function (someDirectLoginReferences) { SimpleTest.is(someDirectLoginReferences.length, 22, "There should be also 22 direct login references - 2"); }); deferredResult.addMethod(user, 'getRecord', '507f38b06d587d8889698ae1ebbba7ef8f0539b82550dd25779fd9ee88fc0c7a'); deferredResult.addMethodcaller('directLogins'); deferredResult.addCallback(MochiKit.Base.values); deferredResult.addCallback(function (someDirectLogins) { SimpleTest.is(someDirectLogins.length, 1, "The selected record has 4 direct logins"); }); deferredResult.addMethod(user, 'getRecord', '507f38b06d587d8889698ae1ebbba7ef8f0539b82550dd25779fd9ee88fc0c7a'); deferredResult.addMethod(user, 'deleteRecord'); deferredResult.addMethod(user, 'saveChanges'); deferredResult.addMethod(user, 'deleteAllCleanTextData'); deferredResult.addMethod(user, 'login'); deferredResult.addMethod(user, 'getRecords'); deferredResult.addCallback(function (someRecords) { SimpleTest.is(someRecords.length, (20 -1), "After deleting a card, only 19 are left - 2"); }); deferredResult.addMethod(user, 'getDirectLogins'); deferredResult.addCallback(function (someDirectLogins) { SimpleTest.is(someDirectLogins.length, (22 - 1), "Initially the user has 21 direct logins - 2"); }); deferredResult.addMethod(user, 'getHeaderIndex', 'recordsIndex'); deferredResult.addMethodcaller('directLoginsData'); deferredResult.addMethodcaller('values'); deferredResult.addCallback(MochiKit.Base.values); deferredResult.addCallback(function (someDirectLoginReferences) { SimpleTest.is(someDirectLoginReferences.length, (22 - 1), "Once deleted the card, there should be just 21 direct login references left"); }); deferredResult.addCallback(function () { SimpleTest.ok(true, "nothing wrong had happen 'till here - 2"); }); deferredResult.callback(); return deferredResult; }, //------------------------------------------------------------------------- 'simpleSaveChanges_test': function (someTestArgs) { var deferredResult; var proxy; var user; proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); deferredResult = new Clipperz.Async.Deferred("simpleSaveChanges_test", someTestArgs); deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']); deferredResult.addMethod(user, 'login'); deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); deferredResult.addCallback(MochiKit.Base.methodcaller('label')); deferredResult.addTest("Card 1", "This is the initial value of the label ..."); deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); deferredResult.addCallback(MochiKit.Base.methodcaller('setLabel', "New label for Card 1")); deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); deferredResult.addCallback(MochiKit.Base.methodcaller('setNotes', "Setting just the label would not trigger the update of the record data and nothing will end up in the 'updated' list")); deferredResult.addMethod(user, 'getHeaderIndex', 'recordsIndex'); deferredResult.addCallback(MochiKit.Base.methodcaller('prepareRemoteDataForChangedRecords')); deferredResult.addCallback(function (aResult) { SimpleTest.is(aResult['updated'].length, 1, "The updadated record should be listed in the changes getting ready for commit"); return aResult; }) deferredResult.callback(); return deferredResult; }, //------------------------------------------------------------------------- 'saveChangesAndDataCaching_test': function (someTestArgs) { var deferredResult; var proxy; var user; var record_1; var record_2; record_1 = '062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80'; record_2 = '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d'; proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); deferredResult = new Clipperz.Async.Deferred("saveChangesAndDataCaching_test", someTestArgs); deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); deferredResult.addMethod(user, 'login'); deferredResult.addMethod(user, 'getRecord', record_1); deferredResult.addMethodcaller('hasLoadedRemoteData'); deferredResult.addTest(false, "The card data should have not been loaded yet"); deferredResult.addMethod(user, 'getRecord', record_2); deferredResult.addMethodcaller('hasLoadedRemoteData'); deferredResult.addTest(false, "Also the other card data should have not been loaded yet"); deferredResult.addMethod(user, 'getRecord', record_1); deferredResult.addMethodcaller('setLabel', "New title"); deferredResult.addMethod(user, 'getRecord', record_1); deferredResult.addMethodcaller('hasLoadedRemoteData'); deferredResult.addTest(false, "Changing just the label should not trigger the full loading of the card"); deferredResult.addMethod(user, 'getRecord', record_1); deferredResult.addMethodcaller('setNotes', "New note text"); deferredResult.addMethod(user, 'getRecord', record_1); deferredResult.addMethodcaller('hasLoadedRemoteData'); deferredResult.addTest(true, "Changing the notes should trigger the loading of the card"); deferredResult.addMethod(user, 'getRecord', record_2); deferredResult.addMethodcaller('hasLoadedRemoteData'); deferredResult.addTest(false, "Changing record_1 should not trigger the loading of record_2"); deferredResult.addMethod(user, 'hasPendingChanges'); deferredResult.addTest(true, "changing the value of record's label trigger the 'hasPendingChanges' flag"); deferredResult.addMethod(user, 'saveChanges'); deferredResult.addMethod(user, 'hasPendingChanges'); deferredResult.addTest(false, "saving changes should return the user to a state with not changes pending - 3"); deferredResult.addMethod(user, 'getRecord', record_1); deferredResult.addMethodcaller('hasLoadedRemoteData'); deferredResult.addTest(true, "After saving the changes, record_1 sould not have the remote data"); deferredResult.addMethod(user, 'getRecord', record_2); deferredResult.addMethodcaller('hasLoadedRemoteData'); deferredResult.addTest(false, "After saving, record_2 should still be NOT loaded"); deferredResult.callback(); return deferredResult; }, //------------------------------------------------------------------------- 'addNewRecordFieldAndSave_test': function (someTestArgs) { var deferredResult; var proxy; var user; proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); deferredResult = new Clipperz.Async.Deferred("simpleSaveChanges_test", someTestArgs); deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']); deferredResult.addMethod(user, 'login'); deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); deferredResult.addMethodcaller('fields'); deferredResult.addCallback(function (someFields) { SimpleTest.is(MochiKit.Base.values(someFields).length, 3, "The record has initially 3 fields"); }); deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); deferredResult.addCallback(MochiKit.Base.methodcaller('addField', {'label':"New field label", 'value':"New field value", 'isHidden':false})); deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); deferredResult.addMethodcaller('hasPendingChanges'); deferredResult.addTest(true, "adding a field should mark the record as having pending changes"); deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); deferredResult.addMethodcaller('fields'); deferredResult.addCallback(function (someFields) { SimpleTest.is(MochiKit.Base.values(someFields).length, 4, "The record has now 4 fields"); }); deferredResult.addMethod(user, 'saveChanges'); deferredResult.addMethod(user, 'hasPendingChanges'); deferredResult.addTest(false, "saving changes should return the user to a state with not changes pending - 4"); deferredResult.addMethod(user, 'hasAnyCleanTextData'); deferredResult.addTest(true, "after saving changes, hasAnyCleanTextData should be true"); //deferredResult.addCallback(function (aValue) { console.log(">>> #################################################"); return aValue}); deferredResult.addMethod(user, 'deleteAllCleanTextData'); //deferredResult.addCallback(function (aValue) { console.log("<<< #################################################"); return aValue}); deferredResult.addMethod(user, 'hasAnyCleanTextData'); deferredResult.addTest(false, "after deleting all clean text, hasAnyCleanTextData should be false"); deferredResult.callback(); return deferredResult; }, //------------------------------------------------------------------------- 'deleteRecordFieldAndSave_test': function (someTestArgs) { var deferredResult; var proxy; var user; var user2; proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); user2 = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); deferredResult = new Clipperz.Async.Deferred("simpleSaveChanges_test", someTestArgs); deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']); deferredResult.addMethod(user, 'login'); deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); deferredResult.addMethodcaller('fields'); deferredResult.addCallback(function (someFields) { SimpleTest.is(MochiKit.Base.values(someFields).length, 3, "The record has initially 3 fields"); }); deferredResult.collectResults({ 'record': MochiKit.Base.method(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'), 'field': [ MochiKit.Base.method(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'), MochiKit.Base.methodcaller('fields'), MochiKit.Base.values, MochiKit.Base.itemgetter('0') ] }) deferredResult.addCallback(function (someValues) { someValues['record'].removeField(someValues['field']); }); deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); deferredResult.addMethodcaller('hasPendingChanges'); deferredResult.addTest(true, "removing a field should mark the record as having pending changes"); deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); deferredResult.addMethodcaller('fields'); deferredResult.addCallback(function (someFields) { SimpleTest.is(MochiKit.Base.values(someFields).length, 2, "The record has now 2 fields"); }); deferredResult.addMethod(user, 'saveChanges'); deferredResult.addMethod(user, 'hasPendingChanges'); deferredResult.addTest(false, "saving changes should return the user to a state with not changes pending - 5"); //. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . deferredResult.addMethod(user2, 'login'); deferredResult.addMethod(user2, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); deferredResult.addMethodcaller('fields'); deferredResult.addCallback(function (someFields) { SimpleTest.is(MochiKit.Base.values(someFields).length, 2, "Once saved, the record is left with just two fields"); }); deferredResult.callback(); return deferredResult; }, //------------------------------------------------------------------------- 'loadDirectLogin_test': function (someTestArgs) { var deferredResult; var proxy; var user; proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true}); user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); deferredResult = new Clipperz.Async.Deferred("loadDirectLogin_test", someTestArgs); deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); deferredResult.addMethod(user, 'login'); deferredResult.addMethod(user, 'getRecord', '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551'); deferredResult.addCallback(MochiKit.Base.methodcaller('directLogins')); deferredResult.addCallback(function (someDirectLogins) { SimpleTest.is(1, MochiKit.Base.keys(someDirectLogins).length, "the Amazon.com card has just one direct login"); }); deferredResult.addMethod(user, 'getRecord', '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551'); deferredResult.addCallback(MochiKit.Base.methodcaller('hasPendingChanges')); deferredResult.addTest(false, "initially the record does not have any pending changes"); deferredResult.addMethod(user, 'getRecord', '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551'); deferredResult.addCallback(MochiKit.Base.methodcaller('directLogins')); deferredResult.addCallback(MochiKit.Base.itemgetter('03251dc1cbc5398789e4c4b45c52cfac3fcd8c1a4f19a81fa68fc6feae31d55c')); // deferredResult.addCallback(MochiKit.Base.methodcaller('runDirectLogin', true)); deferredResult.addCallback(Clipperz.PM.UI.Common.Controllers.DirectLoginRunner.testDirectLogin); deferredResult.addMethod(user, 'getRecord', '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551'); deferredResult.addCallback(MochiKit.Base.methodcaller('getFieldsValues')); deferredResult.addCallback(function (someFieldsValues) { SimpleTest.is(MochiKit.Base.keys(someFieldsValues).length, 2, "the Amazon.com card has just two fields"); }); deferredResult.addMethod(user, 'getRecord', '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551'); deferredResult.addCallback(MochiKit.Base.methodcaller('hasPendingChanges')); deferredResult.addTest(false, "accessing fields values should not trigger the 'hasPendingChanges' flag"); deferredResult.callback(); return deferredResult; }, //------------------------------------------------------------------------- 'readingVeryOldCards_test': function (someTestArgs) { var deferredResult; var proxy; var user; proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true}); user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); deferredResult = new Clipperz.Async.Deferred("readingVeryOldCards_test", someTestArgs); deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_someExtraOldData']); deferredResult.addMethod(user, 'login'); deferredResult.addMethod(user, 'getRecord', '05aad20ee399b11ddc923e601fcd1d096233634f2ad4c55db4f6435e5f9cc17a'); deferredResult.addMethodcaller('label'); deferredResult.addTest('Card encoded with an old algorithm', 'the label of the selected record is the expected one'); deferredResult.addMethod(user, 'getRecord', '05aad20ee399b11ddc923e601fcd1d096233634f2ad4c55db4f6435e5f9cc17a'); deferredResult.addCallback(MochiKit.Base.methodcaller('fields')); deferredResult.addCallback(function (someFields) { SimpleTest.is(6, MochiKit.Base.keys(someFields).length, "the 'Card encoded with an old algorithm' card has six fields"); }); deferredResult.addMethod(user, 'getRecord', '05aad20ee399b11ddc923e601fcd1d096233634f2ad4c55db4f6435e5f9cc17a'); deferredResult.addMethodcaller('hasPendingChanges'); deferredResult.addTest(false, "accessing the card fields should not trigger the hasPendingChanges flag"); deferredResult.addMethod(user, 'getRecord', '05aad20ee399b11ddc923e601fcd1d096233634f2ad4c55db4f6435e5f9cc17a'); deferredResult.addCallback(MochiKit.Base.methodcaller('addField', {'label':"New field label", 'value':"New field value", 'isHidden':false})); deferredResult.addMethod(user, 'getRecord', '05aad20ee399b11ddc923e601fcd1d096233634f2ad4c55db4f6435e5f9cc17a'); deferredResult.addCallback(MochiKit.Base.methodcaller('fields')); deferredResult.addCallback(function (someFields) { SimpleTest.is(7, MochiKit.Base.keys(someFields).length, "adding a field shoult bring the total field count to 7"); }); deferredResult.addMethod(user, 'getRecord', '05aad20ee399b11ddc923e601fcd1d096233634f2ad4c55db4f6435e5f9cc17a'); deferredResult.addMethodcaller('hasPendingChanges'); deferredResult.addTest(true, "adding a field should mark the record as having pending changes - 2"); deferredResult.callback(); return deferredResult; }, //------------------------------------------------------------------------- 'addingNewEmptyRecordAndSaveChanges_test': function (someTestArgs) { var deferredResult; var proxy; var user; var newRecordReference; proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); user2 = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); deferredResult = new Clipperz.Async.Deferred("addingNewEmptyRecordAndSaveChanges_test", someTestArgs); deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_someExtraOldData']); deferredResult.addMethod(user, 'login'); deferredResult.addMethod(user, 'getRecords'); deferredResult.addCallback(function (someRecords) { SimpleTest.is(MochiKit.Base.keys(someRecords).length, 1, "The user has initially just one record"); }); deferredResult.addMethod(user, 'createNewRecord'); deferredResult.addMethodcaller('reference'); deferredResult.addCallback(function (aNewRecordReference) { newRecordReference = aNewRecordReference; }) deferredResult.addMethod(user, 'getRecords'); deferredResult.addCallback(function (someRecords) { SimpleTest.is(MochiKit.Base.keys(someRecords).length, 2, "After having created a new record, the total should be updated accordingly"); }); deferredResult.addMethod(user, 'getRecord', '05aad20ee399b11ddc923e601fcd1d096233634f2ad4c55db4f6435e5f9cc17a'); deferredResult.addMethodcaller('hasPendingChanges'); deferredResult.addTest(false, "adding a new record should not trigger any changes on a sibling record"); deferredResult.addMethod(user, 'hasPendingChanges'); deferredResult.addTest(true, "adding a new record should trigger the 'has pending changes' flag on the user"); deferredResult.addMethod(user, 'saveChanges'); deferredResult.addMethod(user2, 'login'); deferredResult.addMethod(user2, 'getRecords'); deferredResult.addCallback(function (someRecords) { SimpleTest.is(MochiKit.Base.keys(someRecords).length, 1, "Reloading the data, just one record is available, as a brand new record without any changes should not be saved"); }); deferredResult.callback(); return deferredResult; }, //------------------------------------------------------------------------- 'addNewRecordAndSaveChanges_test': function (someTestArgs) { var deferredResult; var proxy; var user; proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); user2 = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); deferredResult = new Clipperz.Async.Deferred("addNewRecordAndSaveChanges_test", someTestArgs); deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_someExtraOldData']); deferredResult.addMethod(user, 'login'); deferredResult.addMethod(user, 'getRecords'); deferredResult.addCallback(function (someRecords) { SimpleTest.is(MochiKit.Base.keys(someRecords).length, 1, "The user has initially just one record"); }); deferredResult.addMethod(user, 'createNewRecord'); deferredResult.addCallback(function (aNewRecord) { var innerDeferredResult; innerDeferredResult = new Clipperz.Async.Deferred("addNewRecordAndSaveChanges_test ", {trace:false}); innerDeferredResult.addMethod(aNewRecord, 'label'); innerDeferredResult.addTest('', "The label of a brand new record should be the empty string"); innerDeferredResult.addMethod(aNewRecord, 'setLabel', "New record label"); innerDeferredResult.addMethod(aNewRecord, 'setNotes', "New record notes"); innerDeferredResult.addMethod(aNewRecord, 'addField', {'label':"Label 1", 'value':"Value 1", 'isHidden':false}); innerDeferredResult.addMethod(aNewRecord, 'addField', {'label':"Label 2", 'value':"Value 2", 'isHidden':false}); innerDeferredResult.addMethod(aNewRecord, 'addField', {'label':"Label 3", 'value':"Value 3", 'isHidden':true}); innerDeferredResult.addMethod(aNewRecord, 'addField', {'label':"Label 4", 'value':"Value 4", 'isHidden':false}); innerDeferredResult.callback(); return innerDeferredResult; }) deferredResult.addMethod(user, 'getRecords'); deferredResult.addCallback(function (someRecords) { SimpleTest.is(MochiKit.Base.keys(someRecords).length, 2, "After having created a new record, the total should be updated accordingly"); }); deferredResult.addMethod(user, 'getRecord', '05aad20ee399b11ddc923e601fcd1d096233634f2ad4c55db4f6435e5f9cc17a'); deferredResult.addMethodcaller('hasPendingChanges'); deferredResult.addTest(false, "adding a new record should not trigger any changes on a sibling record"); deferredResult.addMethod(user, 'hasPendingChanges'); deferredResult.addTest(true, "adding a new record should trigger the 'has pending changes' flag on the user"); deferredResult.addMethod(user, 'saveChanges'); deferredResult.addCallback(function () { var recordData var recordVersionData; recordData = MochiKit.Base.values(proxy.dataStore().data()['users']['9a984e219b07f9b645ef35f4de938b4741abe2e0b4adc88b40e9367170c91cc8']['records'])[1]; recordVersionData = MochiKit.Base.values(recordData['versions'])[0]; SimpleTest.is(recordVersionData['previousVersionKey'], Clipperz.PM.Crypto.nullValue, "The previous version key on the first version of a newly created record is equal to Clipperz.PM.Crypto.nullValue"); }); deferredResult.addMethod(user2, 'login'); deferredResult.addMethod(user2, 'getRecords'); deferredResult.addCallback(function (someRecords) { SimpleTest.is(someRecords.length, 2, "Reloading the data, two records are available."); return someRecords; }); deferredResult.addCallback(MochiKit.Base.itemgetter('1')); deferredResult.collectResults({ 'label': [ MochiKit.Base.methodcaller('label'), Clipperz.Async.Test.is("New record label", "The label is correct") ], 'notes': [ MochiKit.Base.methodcaller('notes'), Clipperz.Async.Test.is("New record notes", "The note is correct") ], 'fields': [ MochiKit.Base.methodcaller('fields'), function (someFields) { SimpleTest.is(MochiKit.Base.values(someFields).length, 4, "The fields are 4, as expected"); return someFields; } ] }) deferredResult.callback(); return deferredResult; }, //------------------------------------------------------------------------- 'addNewRecordAndTestNewRecordIndex_test': function (someTestArgs) { var deferredResult; var proxy; var user; proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); deferredResult = new Clipperz.Async.Deferred("addNewRecordAndTestNewRecordIndex_test", someTestArgs); deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); deferredResult.addMethod(user, 'login'); deferredResult.addMethod(user, 'getRecords'); deferredResult.addCallback(function (someRecords) { SimpleTest.is(MochiKit.Base.keys(someRecords).length, 20, "The user has initially 20 records"); }); deferredResult.addMethod(user, 'createNewRecord'); deferredResult.addCallback(function (aNewRecord) { var innerDeferredResult; innerDeferredResult = new Clipperz.Async.Deferred("addNewRecordAndTestNewRecordIndex_test ", {trace:false}); innerDeferredResult.addMethod(user, 'getHeaderIndex', 'recordsIndex'); innerDeferredResult.addMethodcaller('recordsIndex'); innerDeferredResult.addCallback(MochiKit.Base.itemgetter(aNewRecord.reference())); innerDeferredResult.addTest(20, "The index of the new record should be 20"); innerDeferredResult.callback(); return innerDeferredResult; }) deferredResult.callback(); return deferredResult; }, //------------------------------------------------------------------------- 'editRecordAndTestForChangesInPreferencesAndOTP_test': function (someTestArgs) { var deferredResult; var proxy; var user; var user_2; var originalPreferences; var originalOTPs; proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); user_2 = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); deferredResult = new Clipperz.Async.Deferred("editRecordAndTestForChangesInPreferencesAndOTP_test", someTestArgs); deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_with_preferences_and_OTPs_data']); deferredResult.addMethod(user, 'login'); deferredResult.addMethod(user, 'getServerData'); deferredResult.collectResults({ 'preferences': [ MochiKit.Base.method(user, 'getHeaderIndex', 'preferences'), MochiKit.Base.methodcaller('getDecryptedData') ], 'oneTimePasswords': [ MochiKit.Base.method(user, 'getHeaderIndex', 'oneTimePasswords'), MochiKit.Base.methodcaller('getDecryptedData') ] }); deferredResult.addCallback(function (someValues) { //console.log("SOME VALUES", someValues); originalPreferences = Clipperz.Base.deepClone(someValues['preferences']); originalOTPs = Clipperz.Base.deepClone(someValues['oneTimePasswords']); SimpleTest.is(originalPreferences['preferredLanguage'], 'en-US', "Preference.language is ok"); SimpleTest.is(originalPreferences['shouldShowDonationPanel'], false, "Preference.shouldShowDonationPanel is ok"); SimpleTest.is(MochiKit.Base.keys(originalOTPs).length, 6, "the number of OTPs is as expected"); }); deferredResult.addMethod(user, 'getRecord', '35b30f9e923ce913365815d44cf344ce66cb71b636093b8ec55b8245d13df82b'); deferredResult.addCallback(MochiKit.Base.methodcaller('setLabel', "NEW LABEL")); deferredResult.addMethod(user, 'saveChanges'); deferredResult.addMethod(user_2, 'login'); deferredResult.addMethod(user_2, 'getServerData'); deferredResult.collectResults({ 'preferences': [ MochiKit.Base.method(user_2, 'getHeaderIndex', 'preferences'), MochiKit.Base.methodcaller('getDecryptedData') ], 'oneTimePasswords': [ MochiKit.Base.method(user_2, 'getHeaderIndex', 'oneTimePasswords'), MochiKit.Base.methodcaller('getDecryptedData') ] }); deferredResult.addCallback(function (someValues) { //console.log("SOME VALUES", someValues); // originalPreferences = Clipperz.Base.deepClone(someValues['preferences']); // originalOTPs = Clipperz.Base.deepClone(someValues['oneTimePasswords']); SimpleTest.is(someValues['preferences']['preferredLanguage'], originalPreferences['preferredLanguage'], "Preference.language is preserved"); SimpleTest.is(someValues['preferences']['shouldShowDonationPanel'], originalPreferences['shouldShowDonationPanel'], "Preference.shouldShowDonationPanel is preserved"); SimpleTest.is(MochiKit.Base.keys(someValues['oneTimePasswords']).length, MochiKit.Base.keys(originalOTPs).length, "the number of OTPs is preserved"); }); deferredResult.callback(); return deferredResult; }, //------------------------------------------------------------------------- 'addRecordAndSaveChangesMultipleTimes_test': function (someTestArgs) { var deferredResult; var proxy; var user; proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); user2 = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); deferredResult = new Clipperz.Async.Deferred("addRecordAndSaveChangesMultipleTimes_test", someTestArgs); deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_someExtraOldData']); deferredResult.addMethod(user, 'login'); deferredResult.addMethod(user, 'getRecords'); deferredResult.addCallback(MochiKit.Base.itemgetter('length')); deferredResult.addTest(1, "The user has one record stored in its account"); deferredResult.addMethod(user, 'hasPendingChanges'); deferredResult.addTest(false, "After loading records, the user should have no pending changes"); deferredResult.addMethod(user, 'createNewRecord'); deferredResult.addCallback(function (aNewRecord) { var innerDeferredResult; innerDeferredResult = new Clipperz.Async.Deferred("addRecordAndSaveChangesMultipleTimes_test ", {trace:false}); innerDeferredResult.addMethod(aNewRecord, 'setLabel', "New record 1"); innerDeferredResult.addMethod(aNewRecord, 'addField', {'label':'record number', 'value':"1", 'isHidden':false}); innerDeferredResult.addMethod(aNewRecord, 'addField', {'label':'field count', 'value':"2", 'isHidden':false}); innerDeferredResult.callback(); return innerDeferredResult; }) deferredResult.addMethod(user, 'hasPendingChanges'); deferredResult.addTest(true, "Before saving, the user has pending changes"); deferredResult.addMethod(user, 'saveChanges'); deferredResult.addCallback(SimpleTest.ok, true, "Saving worked (apparently) fine"); deferredResult.addMethod(user, 'hasPendingChanges'); deferredResult.addTest(false, "After saving, the user has no pending changes"); deferredResult.addMethod(user, 'createNewRecord'); deferredResult.addCallback(function (aNewRecord) { var innerDeferredResult; innerDeferredResult = new Clipperz.Async.Deferred("addRecordAndSaveChangesMultipleTimes_test ", {trace:false}); innerDeferredResult.addMethod(aNewRecord, 'setLabel', "New record 2"); innerDeferredResult.addMethod(aNewRecord, 'addField', {'label':"record number", 'value':"2", 'isHidden':false}); innerDeferredResult.callback(); return innerDeferredResult; }) deferredResult.addMethod(user, 'saveChanges'); deferredResult.addMethod(user, 'getRecords'); deferredResult.addCallback(MochiKit.Base.itemgetter('length')); deferredResult.addTest(3, "After having created two new records, the total should be updated accordingly"); deferredResult.addMethod(user2, 'login'); deferredResult.addMethod(user2, 'getRecords'); deferredResult.addCallback(MochiKit.Base.itemgetter('length')); deferredResult.addTest(3, "Reloading the data, three records are available"); deferredResult.addMethod(user2, 'recordWithLabel', 'New record 1'); //deferredResult.addCallback(function (aValue) { console.log("RECORD with Label", aValue); return aValue; }); deferredResult.collectResults({ 'label': [ MochiKit.Base.methodcaller('label'), MochiKit.Base.partial(Clipperz.Async.Test.is, 'New record label', "The label is correct") ], 'notes': [ MochiKit.Base.methodcaller('notes'), Clipperz.Async.Test.is('', "The note of the new created record is empty") ], 'fields': [ MochiKit.Base.methodcaller('fields'), MochiKit.Base.values, MochiKit.Base.itemgetter('length'), Clipperz.Async.Test.is(2, "The new record has just one field, as expected") ], 'fieldValues_1': [ MochiKit.Base.methodcaller('fieldWithLabel', 'record number'), MochiKit.Base.methodcaller('value'), Clipperz.Async.Test.is('1', "The field value is as expected") ], 'fieldValues_2': [ MochiKit.Base.methodcaller('fieldWithLabel', 'field count'), MochiKit.Base.methodcaller('value'), Clipperz.Async.Test.is('2', "Also the second field value is as expected") ] }) deferredResult.callback(); return deferredResult; }, //------------------------------------------------------------------------- 'addNewRecordAndRevertChanges_test': function (someTestArgs) { var deferredResult; var proxy; var user, user2; proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); user2 = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); deferredResult = new Clipperz.Async.Deferred("addNewRecordAndRevertChanges_test", someTestArgs); deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_someExtraOldData']); deferredResult.addMethod(user, 'login'); deferredResult.addMethod(user, 'getRecords'); deferredResult.addCallback(function (someRecords) { SimpleTest.is(MochiKit.Base.keys(someRecords).length, 1, "The user has initially just one record"); }); deferredResult.addMethod(user, 'createNewRecord'); deferredResult.addCallback(function (aNewRecord) { return Clipperz.Async.callbacks("addNewRecordAndRevertChanges_test ", [ MochiKit.Base.method(aNewRecord, 'setLabel', "New record label"), MochiKit.Base.method(aNewRecord, 'setNotes', "New record notes"), MochiKit.Base.method(aNewRecord, 'addField', {'label':"Label 1", 'value':"Value 1", 'isHidden':false}), MochiKit.Base.method(aNewRecord, 'addField', {'label':"Label 2", 'value':"Value 2", 'isHidden':false}), MochiKit.Base.method(aNewRecord, 'addField', {'label':"Label 3", 'value':"Value 3", 'isHidden':true}), MochiKit.Base.method(aNewRecord, 'addField', {'label':"Label 4", 'value':"Value 4", 'isHidden':false}) ], {trace:false}); }) deferredResult.addMethod(user, 'getRecords'); deferredResult.addCallback(function (someRecords) { SimpleTest.is(MochiKit.Base.keys(someRecords).length, 2, "After having created a new record, the total should be updated accordingly"); }); deferredResult.addMethod(user, 'getRecord', '05aad20ee399b11ddc923e601fcd1d096233634f2ad4c55db4f6435e5f9cc17a'); deferredResult.addMethodcaller('hasPendingChanges'); deferredResult.addTest(false, "adding a new record should not trigger any changes on a sibling record"); deferredResult.addMethod(user, 'hasPendingChanges'); deferredResult.addTest(true, "adding a new record should trigger the 'has pending changes' flag on the user"); deferredResult.addMethod(user, 'revertChanges'); deferredResult.addMethod(user, 'hasPendingChanges'); deferredResult.addTest(false, "reverting changes shoud restore the previous state on the user"); deferredResult.addMethod(user2, 'login'); deferredResult.addMethod(user2, 'getRecords'); deferredResult.addCallback(function (someRecords) { SimpleTest.is(someRecords.length, 1, "Reloading the data, just one record is available."); return someRecords; }); deferredResult.callback(); return deferredResult; }, //------------------------------------------------------------------------- 'logout_test': function (someTestArgs) { var deferredResult; var proxy; var user; proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); deferredResult = new Clipperz.Async.Deferred("logout_test", someTestArgs); deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_with_preferences_and_OTPs_data']); deferredResult.addMethod(user, 'login'); deferredResult.addMethod(user, 'getRecords'); deferredResult.addCallback(function (someRecords) { SimpleTest.is(MochiKit.Base.keys(someRecords).length, 18, "The user has 18 records"); }); deferredResult.addMethod(user, 'logout'); deferredResult.shouldSucceed("Logging out should not trigger an exception"); deferredResult.callback(); return deferredResult; }, //------------------------------------------------------------------------- 'lock_test': function (someTestArgs) { var deferredResult; var proxy; var user; var returnPassword = function () { return MochiKit.Async.succeed('clipperz'); }; var failPassword = function () { throw "Unexpected access to the password"; }; var currentPasswordFunction = returnPassword; var passwordFunction = function () { return currentPasswordFunction(); }; proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:passwordFunction}); deferredResult = new Clipperz.Async.Deferred("lock_test", someTestArgs); deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_with_preferences_and_OTPs_data']); deferredResult.addMethod(user, 'login'); deferredResult.addMethod(user, 'getRecords'); deferredResult.addCallback(function (someRecords) { SimpleTest.is(MochiKit.Base.keys(someRecords).length, 18, "The user has 18 records"); }); deferredResult.addMethod(user, 'getDirectLogins'); deferredResult.addCallback(function (someDirectLogins) { SimpleTest.is(MochiKit.Base.keys(someDirectLogins).length, 22, "The user has 22 direct logins"); }); deferredResult.addMethod(proxy, 'shouldNotReceiveAnyFurtherRequest'); deferredResult.addCallback(function () { currentPasswordFunction = failPassword; }); deferredResult.addMethod(user, 'lock'); deferredResult.shouldSucceed("Locking out should not trigger an exception"); deferredResult.addMethod(proxy, 'unexpectedRequests'); deferredResult.addCallback(MochiKit.Base.itemgetter('length')); deferredResult.addTest(0, "The proxy should have not received any extra request"); //deferredResult.addCallback(function (aValue) { console.log("PROXY.unexpectedRequests", Clipperz.Base.serializeJSON(proxy.unexpectedRequests())); return aValue; }); deferredResult.addMethod(proxy, 'mayReceiveMoreRequests'); deferredResult.addCallback(function () { currentPasswordFunction = returnPassword; }); deferredResult.callback(); return deferredResult; }, //------------------------------------------------------------------------- 'registerNewUser_test': function (someTestArgs) { var deferredResult; var proxy; var user, user2; var username; var passphrase; username = "new"; passphrase = "user"; proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); // user2 = new Clipperz.PM.DataModel.User({username:username, getPassphraseFunction:function () { return MochiKit.Async.succeed(passphrase);}}); user2 = new Clipperz.PM.DataModel.User({username:username, getPassphraseFunction:function () { return passphrase;}}); deferredResult = new Clipperz.Async.Deferred("registerNewUser_test", someTestArgs); deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_with_preferences_and_OTPs_data']); deferredResult.addCallback(Clipperz.PM.DataModel.User.registerNewAccount, username, function () { return MochiKit.Async.succeed(passphrase);}); deferredResult.setValue('user'); deferredResult.addMethodcaller('getRecords'); deferredResult.addCallback(function (someRecords) { SimpleTest.is(MochiKit.Base.keys(someRecords).length, 0, "The newly created user has no records"); }); deferredResult.getValue('user'); deferredResult.addMethodcaller('logout'); deferredResult.addMethod(user2, 'login'); deferredResult.addMethod(user2, 'getDirectLogins'); deferredResult.addCallback(function (someDirectLogins) { SimpleTest.is(MochiKit.Base.keys(someDirectLogins).length, 0, "The user has no direct logins"); }); deferredResult.callback(); return deferredResult; }, //------------------------------------------------------------------------- 'registerNewUserAndAddARecord_test': function (someTestArgs) { var deferredResult; var proxy; var user, user2; var username; var passphrase; username = "new"; passphrase = "user"; proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); user2 = new Clipperz.PM.DataModel.User({username:username, getPassphraseFunction:function () { return passphrase;}}); deferredResult = new Clipperz.Async.Deferred("registerNewUserAndAddARecord_test", someTestArgs); deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_with_preferences_and_OTPs_data']); deferredResult.addCallback(Clipperz.PM.DataModel.User.registerNewAccount, username, function () { return MochiKit.Async.succeed(passphrase);}); deferredResult.setValue('user'); deferredResult.addMethodcaller('getRecords'); deferredResult.addCallback(function (someRecords) { SimpleTest.is(MochiKit.Base.keys(someRecords).length, 0, "The newly created user has no records"); }); deferredResult.getValue('user'); deferredResult.addMethodcaller('createNewRecord'); deferredResult.addCallback(function (aNewRecord) { var innerDeferredResult; innerDeferredResult = new Clipperz.Async.Deferred("addRecordAndSaveChangesMultipleTimes_test ", {trace:false}); innerDeferredResult.addMethod(aNewRecord, 'setLabel', "New record 1"); innerDeferredResult.addMethod(aNewRecord, 'addField', {'label':'record number', 'value':"1", 'isHidden':false}); innerDeferredResult.addMethod(aNewRecord, 'addField', {'label':'field count', 'value':"2", 'isHidden':false}); innerDeferredResult.callback(); return innerDeferredResult; }) deferredResult.getValue('user'); deferredResult.addMethodcaller('saveChanges'); deferredResult.addCallback(SimpleTest.ok, true, "Saving worked (apparently) fine"); deferredResult.getValue('user'); deferredResult.addMethodcaller('logout'); deferredResult.addMethod(user2, 'login'); deferredResult.addMethod(user2, 'getRecords'); deferredResult.addCallback(function (someDirectLogins) { SimpleTest.is(MochiKit.Base.keys(someDirectLogins).length, 1, "The user - even after a brand new login - has the newly created record"); }); deferredResult.callback(); return deferredResult; }, //------------------------------------------------------------------------- 'changePassphrase_test': function (someTestArgs) { var deferredResult; var proxy; var user; var user2; var newPassphrase; newPassphrase = 'zreppilc'; proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); user2 = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return newPassphrase;}}); deferredResult = new Clipperz.Async.Deferred("changePassphrase_test", someTestArgs); deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); deferredResult.addMethod(user, 'login'); deferredResult.addMethod(user, 'getRecords'); deferredResult.addCallback(MochiKit.Base.itemgetter('length')); deferredResult.addTest(20, "This account has oly a single card"); deferredResult.addMethod(user, 'changePassphrase', newPassphrase); deferredResult.addMethod(user, 'logout'); deferredResult.addMethod(user2, 'login'); deferredResult.addMethod(user2, 'getRecords'); deferredResult.addCallback(MochiKit.Base.itemgetter('length')); deferredResult.addTest(20, "This account has oly a single card"); deferredResult.callback(); return deferredResult; }, //------------------------------------------------------------------------- /* 'rearrangeRecordFieldOrderAndSave_test': function (someTestArgs) { var deferredResult; var proxy; var user; proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); deferredResult = new Clipperz.Async.Deferred("simpleSaveChanges_test", someTestArgs); deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']); deferredResult.addMethod(user, 'login'); deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); deferredResult.addMethodcaller('fields'); deferredResult.addCallback(function (someFields) { var fields; fields = MochiKit.Base.values(someFields); SimpleTest.is(fields.length, 3, "The record has initially 3 fields"); SimpleTest.is(fields[0].reference(), '6a84c414866dd6d266186f0255a595e9330fb34973c085a81a6e4906876c721b', "the first field is the expected one"); SimpleTest.is(fields[1].reference(), 'fde88847cdbae6f7ee7e38aca1a242492888ff430a79c997bc6ba4afd0540ca2', "the second field is the expected one"); SimpleTest.is(fields[2].reference(), 'bd4e3bb9d3497f63c4c3a507d4b80f489fdb57deb9d1b342a5e1cff65936a410', "the third field is the expected one"); }); // "6a84c414866dd6d266186f0255a595e9330fb34973c085a81a6e4906876c721b": { // "label":"Label 1","value":"Value 1","type":"TXT","hidden":false // }, // "fde88847cdbae6f7ee7e38aca1a242492888ff430a79c997bc6ba4afd0540ca2": { // "label":"Label 2","value":"Value 2","type":"PWD","hidden":true // }, // "bd4e3bb9d3497f63c4c3a507d4b80f489fdb57deb9d1b342a5e1cff65936a410": { // "label":"Label 3","value":"http://www.example.com","type":"URL","hidden":false // } deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); deferredResult.addCallback(MochiKit.Base.methodcaller('sortFieldReference', [ 'bd4e3bb9d3497f63c4c3a507d4b80f489fdb57deb9d1b342a5e1cff65936a410', '6a84c414866dd6d266186f0255a595e9330fb34973c085a81a6e4906876c721b', 'bd4e3bb9d3497f63c4c3a507d4b80f489fdb57deb9d1b342a5e1cff65936a410' ])); deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); deferredResult.addMethodcaller('hasPendingChanges'); deferredResult.addTest(true, "adding a field should mark the record as having pending changes"); deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); deferredResult.addMethodcaller('fields'); deferredResult.addCallback(function (someFields) { SimpleTest.is(MochiKit.Base.values(someFields).length, 4, "The record has now 4 fields"); }); deferredResult.addMethod(user, 'saveChanges'); deferredResult.addMethod(user, 'hasPendingChanges'); deferredResult.addTest(false, "saving changes should return the user to a state with not changes pending - 4"); deferredResult.callback(); return deferredResult; }, */ //------------------------------------------------------------------------- 'syntaxFix': MochiKit.Base.noop }; //############################################################################# SimpleTest.runDeferredTests("Clipperz.PM.DataModel.User", tests, {trace:false});