Diffstat (limited to 'frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.test.js') (more/less context) (ignore whitespace changes)
-rw-r--r-- | frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.test.js | 2082 |
1 files changed, 2082 insertions, 0 deletions
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.test.js b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.test.js new file mode 100644 index 0000000..4e7a21f --- a/dev/null +++ b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.test.js @@ -0,0 +1,2082 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + <http://www.gnu.org/licenses/>. + +*/ + +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<script>alert(\"nothing bad in here\");</script><script>alert(\"AAHHGGGH!\");</script>", "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<script>alert(\"nothing bad in here\");</script><script>alert(\"AAHHGGGH!\");</script>", "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<script>alert(\"nothing bad in here\");</script><script>alert(\"AAHHGGGH!\");</script>", "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<script>alert(\"nothing bad in here\");</script><script>alert(\"AAHHGGGH!\");</script>")); + + 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 <internal>", {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 <internal>", {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 <internal [1]>", {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 <internal [2]>", {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 <internal>", [ + 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 <internal [1]>", {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}); |