summaryrefslogtreecommitdiff
path: root/frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.test.js
Side-by-side diff
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.js2082
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});