summaryrefslogtreecommitdiff
path: root/frontend/gamma/tests/tests/Clipperz/PM/DataModel/Record.test.js
Side-by-side diff
Diffstat (limited to 'frontend/gamma/tests/tests/Clipperz/PM/DataModel/Record.test.js') (more/less context) (ignore whitespace changes)
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/DataModel/Record.test.js1285
1 files changed, 1285 insertions, 0 deletions
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/Record.test.js b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/Record.test.js
new file mode 100644
index 0000000..7d024d9
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/Record.test.js
@@ -0,0 +1,1285 @@
+/*
+
+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 = {
+
+ //-------------------------------------------------------------------------
+
+ 'recordUseOf_retrieveIndexDataFunction_and_getRemoteDataFunction_test': function (someTestArgs) {
+ var deferredResult;
+ var record;
+
+//console.log("#### new Clipperz.PM.DataModel.Record [5]");
+ record = new Clipperz.PM.DataModel.Record({
+ 'reference': '<<< record reference >>>',
+ 'retrieveKeyFunction': MochiKit.Base.noop,
+ 'retrieveRemoteDataFunction': function (aRecordReference) {
+ SimpleTest.is(aRecordReference, '<<< record reference >>>', "Record correctly passes its record reference when asking for encrypted data");
+ return MochiKit.Async.succeed({
+ // fake server payload
+ 'data': "#### fake encrypted data ####",
+ 'version': "0.x",
+ 'currentVersion': {
+ 'reference': "<<< fake record version reference >>>",
+ 'data': "#### fake encrypted data ####",
+ 'version': "0.x"
+ }
+ });
+ },
+ 'updateDate': "Thu, 10 May 2007 13:01:21 UTC",
+// 'encryptedDataKeypath': 'data',
+// 'encryptedVersionKeypath': 'version',
+
+ 'retrieveIndexDataFunction': function (aRecordReference) {
+ SimpleTest.is(aRecordReference, '<<< record reference >>>', "Record correctly passes its record reference when asking for index data");
+ return MochiKit.Async.succeed({
+ key: '<< key >>',
+ label: '<< label >>',
+ notes: '<< notes >>'
+ });
+ },
+ 'updateIndexDataFunction': MochiKit.Base.noop
+
+ });
+
+ deferredResult = new Clipperz.Async.Deferred("recordUseOf_retrieveIndexDataFunction_and_getEncryptedDataFunction_test", someTestArgs);
+ deferredResult.addMethod(record, 'label');
+ deferredResult.addTest('<< label >>', "Record returns the right value for label");
+ deferredResult.addMethod(record, 'notes');
+ deferredResult.addTest('<< notes >>', "Record returns the right value for notes - even the legacy one, stored on the header");
+ deferredResult.addMethod(record, 'getRemoteData');
+ deferredResult.addCallback(Clipperz.Async.Test.isDeeply({ 'data': "#### fake encrypted data ####", 'version': "0.x", 'currentVersion': { 'reference': "<<< fake record version reference >>>", 'data': "#### fake encrypted data ####", 'version': "0.x" } }, "Record returns the expected encrypted data"));
+ deferredResult.callback();
+
+ return deferredResult;
+ },
+
+ //-------------------------------------------------------------------------
+
+ 'createRecordWithoutAllRequiredParameters_test': function (someTestArgs) {
+ var record;
+
+ try {
+//console.log("#### new Clipperz.PM.DataModel.Record [6]");
+ record = new Clipperz.PM.DataModel.Record({reference:'--'});
+ SimpleTest.ok(false, "creating a record without all parameters should raise an exception");
+ } catch(exception) {
+// SimpleTest.is(exception.name, "Clipperz.Base.exception.MandatoryParameter", "creating a record without all parameters raises an exception");
+ SimpleTest.ok(/Clipperz\.Base\.exception\.MandatoryParameter.*/.test(exception.name), "creating a record without all parameters raises an exception");
+ }
+ },
+
+ //-------------------------------------------------------------------------
+
+ 'recordFromOldData_version_0.1_test': function (someTestArgs) {
+ var deferredResult;
+ var proxy;
+ var user;
+ var recordID;
+
+//console.log("#### new Clipperz.PM.DataModel.Record [7]");
+/*
+ record = new Clipperz.PM.DataModel.Record({
+ 'reference': '05aad20ee399b11ddc923e601fcd1d096233634f2ad4c55db4f6435e5f9cc17a',
+ 'retrieveKeyFunction': MochiKit.Base.partial(MochiKit.Async.succeed, 'e038652297f981d5ca917d88fa2c4c3251a12c0fa41bf7313a4d24a9738fe6c6'),
+ 'retrieveRemoteDataFunction': MochiKit.Base.partial(MochiKit.Async.succeed, {
+ 'data': '4ec19a7093534e7dcf7c796b889283c6cec224b1895720ba3ff43ce091dc72c61fd5ea56def418ba3f15239f73228c6c8558585311f5e6673efe57482a1f9c9fe71e921576989eace671ec543685e3ad8f976bbfa4c2dbc629fab936c227d4fd4da3a1561ea79e553bae7b758ff91762572c1448a2d18bec797e12721238ef5ba18ddf1fba8ae773a8debe1040b3b158220aec6be9c7190687139f589a30d9c8887792fd7040e3c7cf3f9999fb9dde1f9f334d17c996996d538a7e374ac93135acafdaf5fce738a1702182897b63d2cb8e308b94156473cba63dcc557d17dcbdb55fcff63d9ba5edf68c42855052e34207d6fabe94fe024c3db616b45f494da42c62224d3897e320080072cc442d4212e7b1e8d5b3d9e3c25d48f4e7c37112ef4c6b2c0c8aff0bd3ce05694370e4378701463dde26c7c0322f8a9eb5a724106039b16b35050a9a9b5717b2eec803efa962b88b9655742f5e7b180ea567449671fb5a2ce563d8b47bc25705821938192eae420391c208182a788dd06fb6448b9858a4104a14efd7717671c65cd08fd979a4da7c01712bc5d4e949a10ef1ea65caf1f07cee34b063bab01bfb7a59047fef30c3059ea652f1c92b9e72aac515ac8851756703772e1fa05384ee7f0d5c7a3c',
+ 'version': '0.1',
+ 'currentVersion': {
+ 'reference': '05aad20ee399b11ddc923e601fcd1d096233634f2ad4c55db4f6435e5f9cc17a',
+ 'data': '4ec19a7093534e7dcf7c796b889283c6cec224b1895720ba3ff43ce091dc72c61fd5ea56def418ba3f15239f73228c6c8558585311f5e6673efe57482a1f9c9fe71e921576989eace671ec543685e3ad8f976bbfa4c2dbc629fab936c227d4fd4da3a1561ea79e553bae7b758ff91762572c1448a2d18bec797e12721238ef5ba18ddf1fba8ae773a8debe1040b3b158220aec6be9c7190687139f589a30d9c8887792fd7040e3c7cf3f9999fb9dde1f9f334d17c996996d538a7e374ac93135acafdaf5fce738a1702182897b63d2cb8e308b94156473cba63dcc557d17dcbdb55fcff63d9ba5edf68c42855052e34207d6fabe94fe024c3db616b45f494da42c62224d3897e320080072cc442d4212e7b1e8d5b3d9e3c25d48f4e7c37112ef4c6b2c0c8aff0bd3ce05694370e4378701463dde26c7c0322f8a9eb5a724106039b16b35050a9a9b5717b2eec803efa962b88b9655742f5e7b180ea567449671fb5a2ce563d8b47bc25705821938192eae420391c208182a788dd06fb6448b9858a4104a14efd7717671c65cd08fd979a4da7c01712bc5d4e949a10ef1ea65caf1f07cee34b063bab01bfb7a59047fef30c3059ea652f1c92b9e72aac515ac8851756703772e1fa05384ee7f0d5c7a3c',
+ 'version': '0.1'
+ }
+
+ }),
+
+ 'retrieveIndexDataFunction': MochiKit.Base.partial(MochiKit.Async.succeed, {
+// 'key': 'e038652297f981d5ca917d88fa2c4c3251a12c0fa41bf7313a4d24a9738fe6c6',
+ 'label': '<< label >>',
+ 'notes': '<< notes >>'
+ }),
+ 'updateIndexDataFunction': MochiKit.Base.noop,
+ 'updateDate': 'Mon Oct 02 10:01:52 CEST 2006'
+ });
+*/
+ proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, isDefault:true, readOnly:false});
+ user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}});
+ recordID = "05aad20ee399b11ddc923e601fcd1d096233634f2ad4c55db4f6435e5f9cc17a";
+
+ deferredResult = new Clipperz.Async.Deferred("recordFromOldData_version_0.1_test", someTestArgs);
+
+ deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_someExtraOldData']);
+ deferredResult.addMethod(user, 'login');
+
+ deferredResult.addMethod(user, 'getRecord', recordID);
+ deferredResult.addMethodcaller('hasAnyCleanTextData');
+ deferredResult.addTest(false, "When first loaded, the record has no clean text data");
+
+ deferredResult.addMethod(user, 'getRecord', recordID);
+ deferredResult.addMethodcaller('label');
+ deferredResult.addTest("Card encoded with an old algorithm", "Record returns the right value for label");
+
+ deferredResult.addMethod(user, 'getRecord', recordID);
+ deferredResult.addMethodcaller('notes');
+ deferredResult.addTest("", "Record returns the right value for notes - even the legacy one, stored on the header");
+
+ deferredResult.addMethod(user, 'getRecord', recordID);
+ deferredResult.addMethodcaller('hasAnyCleanTextData');
+ deferredResult.addTest(true, "After reading some values, the record has some clean text data");
+
+ deferredResult.addMethod(user, 'getRecord', recordID);
+ deferredResult.addMethodcaller('fields');
+ deferredResult.addCallback(function (someFields) {
+ SimpleTest.is(MochiKit.Base.values(someFields).length, 6, "the card has 6 fields");
+ });
+ deferredResult.callback();
+
+ return deferredResult;
+
+ },
+
+ //-------------------------------------------------------------------------
+
+ 'removeDirectLogin': function (someTestArgs) {
+ var deferredResult;
+ var proxy;
+ var user;
+
+ var recordID = 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d'; // YAHOO (4)
+ var directLoginID = 'dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496';
+
+ proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, 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 'clipperz';}});
+
+ deferredResult = new Clipperz.Async.Deferred("Record.test.removeDirectLogin", someTestArgs);
+ deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
+ deferredResult.addMethod(user, 'login');
+ deferredResult.addMethod(user, 'getRecord', recordID);
+ deferredResult.addMethodcaller('directLogins');
+ deferredResult.addCallback(MochiKit.Base.itemgetter(directLoginID));
+ deferredResult.addMethodcaller('remove');
+
+ deferredResult.addMethod(user, 'getRecord', recordID);
+ deferredResult.addMethodcaller('hasPendingChanges');
+ deferredResult.addTest(true, "removing a direct login to a record should result in pending changes on the record");
+
+ deferredResult.addMethod(user, 'saveChanges');
+ deferredResult.addMethod(user, 'hasPendingChanges');
+ deferredResult.addTest(false, "after saving there should be not any pending changes");
+
+ deferredResult.addMethod(user, 'getRecord', recordID);
+ deferredResult.addMethodcaller('directLogins');
+ deferredResult.addCallback(MochiKit.Base.keys);
+ deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
+ deferredResult.addTest(3, "after saving changes, the record should have only 3 direct logins");
+
+ deferredResult.addMethod(user2, 'login');
+ deferredResult.addMethod(user2, 'getRecord', recordID);
+ deferredResult.addMethodcaller('directLogins');
+ deferredResult.addCallback(MochiKit.Base.keys);
+ deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
+ deferredResult.addTest(3, "also reloading all the data with a new user, the direct logins should always be 3");
+
+ deferredResult.callback();
+
+ return deferredResult;
+ },
+
+ //-------------------------------------------------------------------------
+
+ 'removeDirectLoginAndRevertChanges': function (someTestArgs) {
+ var deferredResult;
+ var proxy;
+ var user;
+
+ var recordID = 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d';
+ var directLoginID = 'dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496';
+
+ proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, isDefault:true, readOnly:false});
+ user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
+
+ deferredResult = new Clipperz.Async.Deferred("Record.test.removeDirectLoginAndRevertChanges", someTestArgs);
+ deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
+ deferredResult.addMethod(user, 'login');
+
+ deferredResult.addMethod(user, 'getDirectLogins');
+ deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
+ deferredResult.addTest(22, "the user has 22 initially");
+
+ deferredResult.addMethod(user, 'getRecord', recordID);
+ deferredResult.addMethodcaller('directLogins');
+ deferredResult.addCallback(MochiKit.Base.keys);
+ deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
+ deferredResult.addTest(4, "the selected record has 4 direct logins");
+
+ deferredResult.addMethod(user, 'getRecord', recordID);
+ deferredResult.addMethodcaller('directLogins');
+ deferredResult.addCallback(MochiKit.Base.itemgetter(directLoginID));
+ deferredResult.addMethodcaller('remove');
+
+ deferredResult.addMethod(user, 'getRecord', recordID);
+ deferredResult.addMethodcaller('hasPendingChanges');
+ deferredResult.addTest(true, "removing a direct login to a record should result in pending changes on the record");
+
+ deferredResult.addMethod(user, 'revertChanges');
+ deferredResult.addMethod(user, 'hasPendingChanges');
+ deferredResult.addTest(false, "after reverting the changes, the user should not have pending changes");
+
+ deferredResult.addMethod(user, 'getDirectLogins');
+ deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
+ deferredResult.addTest(22, "after reverting the changes, the user should still have 22 direct logins");
+
+ deferredResult.addMethod(user, 'getRecord', recordID);
+ deferredResult.addMethodcaller('directLogins');
+ deferredResult.addCallback(MochiKit.Base.keys);
+ deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
+ deferredResult.addTest(4, "after reverting the changes, the record should still have 4 direct logins");
+
+ deferredResult.callback();
+
+ return deferredResult;
+ },
+
+ //-------------------------------------------------------------------------
+
+ 'addDirectLoginAndRevertChanges': function (someTestArgs) {
+ var deferredResult;
+ var proxy;
+ var user, user2;
+ var recordID = 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d'; // YAHOO (4)
+ var directLoginReference;
+
+ proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, 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 'clipperz';}});
+
+ deferredResult = new Clipperz.Async.Deferred("Record.test.addDirectLoginAndRevertChanges", someTestArgs);
+ deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
+ deferredResult.addMethod(user, 'login');
+
+ deferredResult.addMethod(user, 'getRecord', recordID);
+ deferredResult.setValue('record');
+ deferredResult.addMethodcaller('directLogins');
+ deferredResult.addCallback(MochiKit.Base.keys);
+ deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
+ deferredResult.addTest(4, "the record, when initially loaded, has 4 direct logins");
+
+ deferredResult.getValue('record');
+ deferredResult.addMethodcaller('createNewDirectLogin');
+ deferredResult.setValue('directLogin');
+
+ deferredResult.getValue('directLogin');
+ deferredResult.addMethodcaller('setLabel', "New direct login");
+
+ deferredResult.getValue('directLogin');
+ deferredResult.addMethodcaller('setBookmarkletConfiguration', '{"page": {"title": "Parallels Account"}, "form": {"attributes": {"action": "https://www.parallels.com/account/", "method": "post"}, "inputs": [{"type": "text", "name": "Email", "value": ""}, {"type": "password", "name": "Password", "value": ""}]}, "version": "0.2.3"}');
+
+ deferredResult.addMethod(user, 'revertChanges');
+//deferredResult.addCallback(function () { console.log("###################################"); });
+ deferredResult.addMethod(user, 'hasPendingChanges');
+ deferredResult.addTest(false, "after reverting the changes, the user should NOT have pending changes");
+
+ deferredResult.getValue('record');
+ deferredResult.addMethodcaller('hasPendingChanges');
+ deferredResult.addTest(false, "after reverting the changes, the record should NOT have pending changes");
+
+ deferredResult.addMethod(user2, 'login');
+
+ deferredResult.addMethod(user2, 'getRecord', recordID);
+ deferredResult.setValue('record_2');
+ deferredResult.addMethodcaller('directLogins');
+ deferredResult.addCallback(MochiKit.Base.keys);
+ deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
+ deferredResult.addTest(4, "the record, when reloaded from scratch, has still 4 direct logins");
+
+ deferredResult.callback();
+
+ return deferredResult;
+ },
+
+ //-------------------------------------------------------------------------
+
+ 'addDirectLoginAndSaveChanges': function (someTestArgs) {
+ var deferredResult;
+ var proxy;
+ var user, user2;
+ var recordID = 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d'; // YAHOO (4)
+ var directLoginReference;
+
+ proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, 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 'clipperz';}});
+
+ deferredResult = new Clipperz.Async.Deferred("Record.test.addDirectLoginAndSaveChanges", someTestArgs);
+ deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
+ deferredResult.addMethod(user, 'login');
+
+ deferredResult.addMethod(user, 'getRecord', recordID);
+ deferredResult.addMethodcaller('hasAnyCleanTextData');
+ deferredResult.addTest(false, "When first loaded, the record has no clean text data [2]");
+
+ deferredResult.addMethod(user, 'getRecord', recordID);
+ deferredResult.setValue('record');
+ deferredResult.addMethodcaller('directLogins');
+ deferredResult.addCallback(MochiKit.Base.keys);
+ deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
+ deferredResult.addTest(4, "the selected record has 4 direct logins");
+
+ deferredResult.addMethod(user, 'getRecord', recordID);
+ deferredResult.addMethodcaller('hasAnyCleanTextData');
+ deferredResult.addTest(false, "Still no clean text data is stored on the record, as all accessed data are stored on the index");
+
+ deferredResult.addMethod(user, 'hasAnyCleanTextData');
+ deferredResult.addTest(true, "the user has some clean text data");
+
+ deferredResult.getValue('record');
+ deferredResult.addMethodcaller('createNewDirectLogin');
+ deferredResult.setValue('directLogin');
+
+ deferredResult.getValue('directLogin');
+ deferredResult.addMethodcaller('label');
+ deferredResult.addTest(null, "The label of a initially created direct login is empty");
+
+ deferredResult.getValue('directLogin');
+ deferredResult.addMethodcaller('bookmarkletConfiguration');
+ deferredResult.addTest('', "The bookmaraklet configuration of a initially created direct login is empty");
+
+ deferredResult.getValue('directLogin');
+ deferredResult.addMethodcaller('bindings');
+ deferredResult.addCallback(Clipperz.Async.Test.isDeeply({}, "The bindings of a initially created direct login is empty"));
+
+ deferredResult.getValue('directLogin');
+ deferredResult.addMethodcaller('setLabel', "New direct login");
+
+ deferredResult.getValue('directLogin');
+ deferredResult.addMethodcaller('setBookmarkletConfiguration', directLoginConfigurations['Parallels']);
+
+ deferredResult.getValue('directLogin');
+ deferredResult.addMethodcaller('bindings');
+ deferredResult.addCallback(MochiKit.Base.itemgetter('Email'));
+ deferredResult.addMethodcaller('setFieldKey', '4cfaf1e782086e7527bd0e0cc82b67eb773e8157ad0c5babe516f7bc945a02a9'); // "userID"
+
+ deferredResult.getValue('directLogin');
+ deferredResult.addMethodcaller('bindings');
+ deferredResult.addCallback(MochiKit.Base.itemgetter('Password'));
+ deferredResult.addMethodcaller('setFieldKey', 'ef2dee54322bf401540657d469e158a50e9228bc0a192a31d2e3ee56a77e565b'); // "password"
+
+ deferredResult.getValue('directLogin');
+ deferredResult.addMethodcaller('favicon'),
+ deferredResult.addTest('http://www.parallels.com/favicon.ico', "the original favicon is the expected one"),
+
+ deferredResult.getValue('directLogin');
+ deferredResult.addMethodcaller('reference');
+ deferredResult.addCallback(function (aReference) {
+ directLoginReference = aReference;
+ });
+
+ deferredResult.addMethod(user, 'hasPendingChanges');
+ deferredResult.addTest(true, "after adding a new direct login, the user should have pending changes");
+
+ deferredResult.getValue('record');
+ deferredResult.addMethodcaller('hasPendingChanges');
+ deferredResult.addTest(true, "after adding a new direct login, the record should have pending changes");
+
+ deferredResult.getValue('record');
+ deferredResult.addMethodcaller('directLogins');
+ deferredResult.addCallback(MochiKit.Base.keys);
+ deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
+ deferredResult.addTest(5, "after adding a new direct login, the record has now 5 direct logins");
+
+
+ deferredResult.addMethod(user, 'saveChanges');
+ deferredResult.addMethod(user, 'hasPendingChanges');
+ deferredResult.addTest(false, "after saving the changes, the user should NOT have pending changes");
+
+
+ deferredResult.addMethod(user2, 'login');
+
+ deferredResult.addMethod(user2, 'getRecord', recordID);
+ deferredResult.setValue('record_2');
+ deferredResult.addMethodcaller('directLogins');
+ deferredResult.addCallback(MochiKit.Base.keys);
+ deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
+ deferredResult.addTest(5, "the record, when reloaded from scratch, has still 5 direct logins");
+
+ deferredResult.getValue('record_2');
+ deferredResult.addMethodcaller('directLogins');
+ deferredResult.addCallback(MochiKit.Base.values);
+ deferredResult.addCallback(MochiKit.Base.itemgetter('4')); // TODO: accessing directLogins by index is not really nice
+ deferredResult.setValue('directLogin_2');
+ deferredResult.addMethodcaller('label');
+ deferredResult.addTest('New direct login', "The label of the direct login has been correctly saved");
+
+ deferredResult.getValue('directLogin_2');
+ deferredResult.addMethodcaller('bindings');
+ deferredResult.addCallback(MochiKit.Base.itemgetter('Email'));
+ deferredResult.addMethodcaller('field');
+ deferredResult.addMethodcaller('value');
+ deferredResult.addTest('joe.clipperz', "The value bound to the direct login 'Email' field is correct");
+
+ deferredResult.getValue('directLogin_2');
+ deferredResult.addMethodcaller('bindings');
+ deferredResult.addCallback(MochiKit.Base.itemgetter('Password'));
+ deferredResult.addMethodcaller('field');
+ deferredResult.addMethodcaller('value');
+ deferredResult.addTest('enfvDG1RxAsl', "The value bound to the direct login 'Password' field is correct");
+
+ deferredResult.callback();
+
+ return deferredResult;
+ },
+
+ //-------------------------------------------------------------------------
+
+ 'readDirectLoginAttributes': function (someTestArgs) {
+ var deferredResult;
+ var proxy;
+ var user;
+
+ var recordID = '2977aa5f99a9f6e5596c1bd7871e82d7328c3716c9ef8ba349ae65f10d97924e';
+ var directLoginID = '03251dc1cbc5398789e4c4b45c52cfac3fcd8c1a4f19a81fa68fc6feae31d55c';
+
+ proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, isDefault:true, readOnly:false});
+ user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
+
+ deferredResult = new Clipperz.Async.Deferred("Record.test.readDirectLoginAttributes", someTestArgs);
+ deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_with_multipleRecordVersions_data']);
+ deferredResult.addMethod(user, 'login');
+
+ deferredResult.addMethod(user, 'getRecord', recordID);
+ deferredResult.addMethodcaller('directLogins');
+ deferredResult.addCallback(MochiKit.Base.itemgetter('03251dc1cbc5398789e4c4b45c52cfac3fcd8c1a4f19a81fa68fc6feae31d55c'));
+ deferredResult.setValue('directLogin');
+
+ deferredResult.getValue('directLogin');
+ deferredResult.addMethodcaller('inputs');
+ deferredResult.addCallback(MochiKit.Base.keys);
+ deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
+ deferredResult.addTest(13, "Amazon direct login has 13 inputs");
+
+ deferredResult.getValue('directLogin');
+ deferredResult.addMethodcaller('inputs');
+ deferredResult.addCallback(MochiKit.Base.values);
+ deferredResult.addCallback(MochiKit.Base.filter, MochiKit.Base.methodcaller('needsFormValue'));
+ deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
+ deferredResult.addTest(1, "Amazon direct login has 1 field needing a form value");
+
+ deferredResult.getValue('directLogin');
+ deferredResult.addMethodcaller('inputs');
+ deferredResult.addCallback(MochiKit.Base.values);
+ deferredResult.addCallback(MochiKit.Base.filter, MochiKit.Base.methodcaller('needsBinding'));
+ deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
+ deferredResult.addTest(2, "Amazon direct login has 2 field needing a binding");
+
+
+ deferredResult.getValue('directLogin');
+ deferredResult.addMethodcaller('bindings');
+ deferredResult.addCallback(MochiKit.Base.keys);
+ deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
+ deferredResult.addTest(2, "Amazon direct login has just two bindings");
+
+ deferredResult.getValue('directLogin');
+ deferredResult.addMethodcaller('bindings');
+ deferredResult.addCallback(MochiKit.Base.itemgetter('email'));
+ deferredResult.addMethodcaller('fieldKey');
+ deferredResult.addTest('5e822c34aaf1a9fbc0b52585c1915f3a3758abd51923a4d35ae85373bbb839c2', "Amazon direct login 'email' binding points to the correct field");
+
+ deferredResult.getValue('directLogin');
+ deferredResult.addMethodcaller('bindings');
+ deferredResult.addCallback(MochiKit.Base.itemgetter('password'));
+ deferredResult.setValue('passwordBinding');
+ deferredResult.addMethodcaller('fieldKey');
+ deferredResult.addTest('01e4bb6dcf054f312c535de8160bcf50bdccd664bdc05721b10d4e69583765f7', "Amazon direct login 'password' binding points to the correct field");
+
+ deferredResult.getValue('passwordBinding');
+ deferredResult.addMethodcaller('field');
+ deferredResult.addMethodcaller('label');
+ deferredResult.addTest('password', "Amazon direct login 'password' binding points to the 'password' field");
+
+
+ deferredResult.getValue('directLogin');
+ deferredResult.addMethodcaller('formValues');
+ deferredResult.addCallback(MochiKit.Base.keys);
+ deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
+ deferredResult.addTest(1, "Amazon direct login has just one formValue");
+
+ deferredResult.getValue('directLogin');
+ deferredResult.addMethodcaller('formValues');
+ deferredResult.addCallback(MochiKit.Base.itemgetter('action'));
+ deferredResult.addMethodcaller('value');
+ deferredResult.addTest('sign-in', "Amazon direct 'action' formValue is set to 'sign-in'");
+
+
+ deferredResult.callback();
+
+ return deferredResult;
+ },
+
+ //-------------------------------------------------------------------------
+
+ 'editDirectLoginLabel': function (someTestArgs) {
+ var deferredResult;
+ var proxy;
+ var user;
+ var oldLabel;
+ var newLabel;
+
+ var recordID = 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d';
+ var directLoginID = 'dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496';
+
+ oldLabel = "Yahoo! Mail";
+ newLabel = "YAHOO! Mail";
+
+ proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, isDefault:true, readOnly:false});
+ user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
+
+ deferredResult = new Clipperz.Async.Deferred("Record.test.editDirectLoginLabel", someTestArgs);
+ deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
+ deferredResult.addMethod(user, 'login');
+
+ deferredResult.addMethod(user, 'getRecord', recordID);
+ deferredResult.addMethodcaller('directLogins');
+ deferredResult.addCallback(MochiKit.Base.itemgetter(directLoginID));
+ deferredResult.addMethodcaller('label');
+ deferredResult.addTest(oldLabel, "the current label of the direct login");
+
+ deferredResult.addMethod(user, 'getRecord', recordID);
+ deferredResult.addMethodcaller('directLogins');
+ deferredResult.addCallback(MochiKit.Base.itemgetter(directLoginID));
+ deferredResult.addMethodcaller('setLabel', newLabel);
+
+ deferredResult.addMethod(user, 'hasPendingChanges');
+ deferredResult.addTest(true, "changing the label of a direct login should trigger some changes");
+
+ deferredResult.addMethod(user, 'getRecord', recordID);
+ deferredResult.addMethodcaller('hasPendingChanges');
+ deferredResult.addTest(true, "changing the label of a direct login should trigger some changes also on the record itself");
+
+ deferredResult.addMethod(user, 'getRecord', recordID);
+ deferredResult.addMethodcaller('directLogins');
+ deferredResult.addCallback(MochiKit.Base.itemgetter(directLoginID));
+ deferredResult.addMethodcaller('hasPendingChanges');
+ deferredResult.addTest(true, "changing the label of a direct login should trigger some changes also on the directLogin itself");
+
+ deferredResult.callback();
+
+ return deferredResult;
+ },
+
+ //-------------------------------------------------------------------------
+
+ 'editDirectLoginFormValueAndRestoreChanges': function (someTestArgs) {
+ var deferredResult;
+ var proxy;
+ var user;
+
+ var recordID = 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d';
+ var directLoginID = 'dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496';
+
+ proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, isDefault:true, readOnly:false});
+ user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
+
+ deferredResult = new Clipperz.Async.Deferred("Record.test.editDirectLoginFormValueAndRestoreChanges", someTestArgs);
+ deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
+ deferredResult.addMethod(user, 'login');
+
+ deferredResult.addMethod(user, 'getRecord', recordID);
+ deferredResult.addMethodcaller('directLogins');
+ deferredResult.addCallback(MochiKit.Base.itemgetter(directLoginID));
+ deferredResult.setValue('directLogin');
+ deferredResult.addMethodcaller('formValues');
+ deferredResult.addCallback(MochiKit.Base.itemgetter('.persistent'));
+ deferredResult.addMethodcaller('value');
+ deferredResult.addTest(null, "original formValue value matches");
+
+ deferredResult.getValue('directLogin');
+ deferredResult.addMethodcaller('formValues');
+ deferredResult.addCallback(MochiKit.Base.itemgetter('.persistent'))
+ deferredResult.addMethodcaller('setValue', 'y');
+
+ deferredResult.getValue('directLogin');
+ deferredResult.addMethodcaller('formValues');
+ deferredResult.addCallback(MochiKit.Base.itemgetter('.persistent'))
+ deferredResult.addMethodcaller('value');
+ deferredResult.addTest('y', "the newly set value is retained");
+
+
+ deferredResult.addMethod(user, 'hasPendingChanges');
+ deferredResult.addTest(true, "changing the label of a direct login should trigger some changes");
+
+ deferredResult.addMethod(user, 'getRecord', recordID);
+ deferredResult.addMethodcaller('hasPendingChanges');
+ deferredResult.addTest(true, "changing the label of a direct login should trigger some changes also on the record itself");
+
+ deferredResult.addMethod(user, 'getRecord', recordID);
+ deferredResult.addMethodcaller('directLogins');
+ deferredResult.addCallback(MochiKit.Base.itemgetter(directLoginID));
+ deferredResult.addMethodcaller('hasPendingChanges');
+ deferredResult.addTest(true, "changing the label of a direct login should trigger some changes also on the directLogin itself");
+
+ deferredResult.addMethod(user, 'revertChanges');
+
+ deferredResult.getValue('directLogin');
+ deferredResult.addMethodcaller('formValues');
+ deferredResult.addCallback(MochiKit.Base.itemgetter('.persistent'))
+ deferredResult.addMethodcaller('value');
+ deferredResult.addTest(null, "the old formValue value is correctly restored");
+
+ deferredResult.callback();
+
+ return deferredResult;
+ },
+
+ //-------------------------------------------------------------------------
+
+ 'editDirectLoginConfigurationAndRevertChanges': function (someTestArgs) {
+ var deferredResult;
+ var proxy;
+ var user;
+
+ var recordID = 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d';
+ var directLoginID = 'dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496';
+
+ proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, isDefault:true, readOnly:false});
+ user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
+
+ deferredResult = new Clipperz.Async.Deferred("Record.test.editDirectLoginConfigurationAndRevertChanges", someTestArgs);
+ deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
+ deferredResult.addMethod(user, 'login');
+
+ deferredResult.addMethod(user, 'getRecord', recordID);
+ deferredResult.addMethodcaller('directLogins');
+ deferredResult.addCallback(MochiKit.Base.itemgetter(directLoginID));
+
+ deferredResult.addCallback(function (aDirectLogin) {
+// var newBookmarkletConfiguration;
+
+// newBookmarkletConfiguration = '{\n \"page\": {\n \"title\": \"Yahoo! Mail\"\n },\n \"form\": {\n \"attributes\": {\n \"action\": \"https://login.yahoo.com/config/login?\",\n \"method\": \"post\"\n },\n \"inputs\": [\n {\n \"type\": \"text\",\n \"name\": \"login\",\n \"value\": \"\"\n },\n {\n \"type\": \"password\",\n \"name\": \"passwd\",\n \"value\": \"\"\n },\n {\n \"type\": \"checkbox\",\n \"name\": \".persistent\",\n \"value\": \"y\"\n }\n ]\n },\n \"version\": \"0.2\"\n}';
+ return Clipperz.Async.callbacks("Record.test.editDirectLoginConfiguration [inner call]", [
+ MochiKit.Base.method(aDirectLogin, 'bookmarkletConfiguration'),
+ Clipperz.Async.Test.is(directLoginConfigurations['Yahoo! Mail'], "the current bookmarkletConfiguration"),
+
+ MochiKit.Base.method(aDirectLogin, 'favicon'),
+ Clipperz.Async.Test.is('http://login.yahoo.com/favicon.ico', "the original favicon is the expected one"),
+
+ MochiKit.Base.method(aDirectLogin, 'setBookmarkletConfiguration', directLoginConfigurations['Parallels']),
+
+ MochiKit.Base.method(aDirectLogin, 'favicon'),
+ Clipperz.Async.Test.is('http://login.yahoo.com/favicon.ico', "the original favicon is the expected one"),
+
+ MochiKit.Base.method(aDirectLogin, 'hasPendingChanges'),
+ Clipperz.Async.Test.ok("changing the configuration should trigger the pending changes on the direct login"),
+ MochiKit.Base.method(aDirectLogin.record(), 'hasPendingChanges'),
+ Clipperz.Async.Test.ok("changing the configuration should trigger the pending changes also on the record"),
+ MochiKit.Base.method(user, 'hasPendingChanges'),
+ Clipperz.Async.Test.ok("changing the configuration should trigger the pending changes also on the user"),
+
+ MochiKit.Base.method(aDirectLogin, 'revertChanges'),
+
+ MochiKit.Base.method(aDirectLogin, 'hasPendingChanges'),
+ Clipperz.Async.Test.fail("reverting changes should reset pending changes on the direct login"),
+ MochiKit.Base.method(aDirectLogin.record(), 'hasPendingChanges'),
+ Clipperz.Async.Test.fail("reverting changes should reset pending changes also on the record"),
+ MochiKit.Base.method(user, 'hasPendingChanges'),
+ Clipperz.Async.Test.fail("reverting changes should reset pending changes also on the user"),
+
+ MochiKit.Base.noop
+ ], someTestArgs);
+ })
+
+ deferredResult.callback();
+
+ return deferredResult;
+ },
+
+ //-------------------------------------------------------------------------
+
+ 'editDirectLoginConfiguration_keepingTheSameStructure_AndSaveChanges': function (someTestArgs) {
+ var deferredResult;
+ var proxy;
+ var user;
+ var user2;
+ var newBookmarkletConfiguration;
+
+ var recordID = 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d';
+ var directLoginID = 'dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496';
+
+ proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, 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 'clipperz';}});
+
+ newBookmarkletConfiguration = '{\n \"page\": {\n \"title\": \"Yahoo! Mail\"\n },\n \"form\": {\n \"attributes\": {\n \"action\": \"https://login.yahoo.com/config/login?\",\n \"method\": \"post\"\n },\n \"inputs\": [\n {\n \"type\": \"text\",\n \"name\": \"login\",\n \"value\": \"\"\n },\n {\n \"type\": \"password\",\n \"name\": \"passwd\",\n \"value\": \"\"\n },\n {\n \"type\": \"checkbox\",\n \"name\": \".persistent\",\n \"value\": \"y\"\n }\n ]\n },\n \"version\": \"0.2\"\n}';
+
+ deferredResult = new Clipperz.Async.Deferred("Record.test.editDirectLoginConfiguration_keepingTheSameStructure_AndSaveChanges", someTestArgs);
+ deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
+ deferredResult.addMethod(user, 'login');
+
+ deferredResult.addMethod(user, 'getRecord', recordID);
+ deferredResult.addMethodcaller('directLogins');
+ deferredResult.addCallback(MochiKit.Base.itemgetter(directLoginID));
+ deferredResult.addCallback(function (aDirectLogin) {
+ return Clipperz.Async.callbacks("Record.test.editDirectLoginConfiguration_keepingTheSameStructure_AndSaveChanges [inner call 1]", [
+ MochiKit.Base.method(aDirectLogin, 'bookmarkletConfiguration'),
+ Clipperz.Async.Test.is(directLoginConfigurations['Yahoo! Mail'], "the current bookmarkletConfiguration (1)"),
+
+ MochiKit.Base.method(aDirectLogin, 'inputs'),
+ MochiKit.Base.keys,
+ MochiKit.Base.itemgetter('length'),
+ Clipperz.Async.Test.is(26, "The original direct login had 26 inputs"),
+
+ MochiKit.Base.method(aDirectLogin, 'bindings'),
+ MochiKit.Base.keys,
+ MochiKit.Base.itemgetter('length'),
+ Clipperz.Async.Test.is(2, "The original direct login had 2 inputs"),
+
+ MochiKit.Base.method(aDirectLogin, 'bindings'),
+ MochiKit.Base.itemgetter('login'),
+ MochiKit.Base.methodcaller('field'),
+ MochiKit.Base.methodcaller('reference'),
+ Clipperz.Async.Test.is('4cfaf1e782086e7527bd0e0cc82b67eb773e8157ad0c5babe516f7bc945a02a9', "the original 'login' direct login binding points to the correct field"),
+
+ MochiKit.Base.method(aDirectLogin, 'formValues'),
+ MochiKit.Base.keys,
+ MochiKit.Base.itemgetter('length'),
+ Clipperz.Async.Test.is(1, "The original direct login had 1 form values"),
+
+ MochiKit.Base.method(aDirectLogin, 'formValues'),
+ MochiKit.Base.itemgetter('.persistent'),
+ MochiKit.Base.methodcaller('type'),
+ Clipperz.Async.Test.is('checkbox', "the original formValue has the expected type"),
+
+ MochiKit.Base.method(aDirectLogin, 'formValues'),
+ MochiKit.Base.itemgetter('.persistent'),
+ MochiKit.Base.methodcaller('value'),
+ Clipperz.Async.Test.is(null, "the original formValue is correct (1)"),
+
+ MochiKit.Base.method(aDirectLogin, 'formValues'),
+ MochiKit.Base.itemgetter('.persistent'),
+ MochiKit.Base.methodcaller('setValue', 'y'),
+
+
+ MochiKit.Base.method(aDirectLogin, 'setBookmarkletConfiguration', newBookmarkletConfiguration),
+ MochiKit.Base.method(user, 'saveChanges'),
+
+ MochiKit.Base.method(aDirectLogin, 'bindings'),
+ MochiKit.Base.itemgetter('login'),
+ MochiKit.Base.methodcaller('field'),
+ MochiKit.Base.methodcaller('reference'),
+ Clipperz.Async.Test.is('4cfaf1e782086e7527bd0e0cc82b67eb773e8157ad0c5babe516f7bc945a02a9', "the 'login' binding is still valid after the new configuration is set"),
+
+ MochiKit.Base.method(aDirectLogin, 'hasPendingChanges'),
+ Clipperz.Async.Test.fail("reverting changes should reset pending changes on the direct login (2)"),
+ MochiKit.Base.method(aDirectLogin.record(), 'hasPendingChanges'),
+ Clipperz.Async.Test.fail("reverting changes should reset pending changes also on the record (2)"),
+ MochiKit.Base.method(user, 'hasPendingChanges'),
+ Clipperz.Async.Test.fail("reverting changes should reset pending changes also on the user (2)"),
+
+ MochiKit.Base.noop
+ ], someTestArgs);
+ })
+
+ deferredResult.addMethod(user2, 'login');
+
+ deferredResult.addMethod(user2, 'getRecord', recordID);
+ deferredResult.addMethodcaller('directLogins');
+ deferredResult.addCallback(MochiKit.Base.itemgetter(directLoginID));
+ deferredResult.addCallback(function (aDirectLogin) {
+ return Clipperz.Async.callbacks("Record.test.editDirectLoginConfiguration_keepingTheSameStructure_AndSaveChanges [inner call 2]", [
+ MochiKit.Base.method(aDirectLogin, 'bookmarkletConfiguration'),
+ Clipperz.Async.Test.is(newBookmarkletConfiguration, "the direct login has the new bookmarkletConfiguration even after being reloaded"),
+
+ MochiKit.Base.method(aDirectLogin, 'inputs'),
+ MochiKit.Base.keys,
+ MochiKit.Base.itemgetter('length'),
+ Clipperz.Async.Test.is(3, "The new direct login has 3 inputs"),
+
+ MochiKit.Base.method(aDirectLogin, 'bindings'),
+ MochiKit.Base.keys,
+ MochiKit.Base.itemgetter('length'),
+ Clipperz.Async.Test.is(2, "The new direct login had 2 inputs"),
+
+ MochiKit.Base.method(aDirectLogin, 'bindings'),
+ MochiKit.Base.itemgetter('login'),
+ MochiKit.Base.methodcaller('field'),
+ MochiKit.Base.methodcaller('reference'),
+ Clipperz.Async.Test.is('4cfaf1e782086e7527bd0e0cc82b67eb773e8157ad0c5babe516f7bc945a02a9', "the new 'login' direct login binding still points to the correct field"),
+
+ MochiKit.Base.method(aDirectLogin, 'formValues'),
+ MochiKit.Base.keys,
+ MochiKit.Base.itemgetter('length'),
+ Clipperz.Async.Test.is(1, "The new direct login had 1 form values (1)"),
+
+ MochiKit.Base.method(aDirectLogin, 'formValues'),
+ MochiKit.Base.itemgetter('.persistent'),
+ MochiKit.Base.methodcaller('value'),
+ Clipperz.Async.Test.is(null, "the formValue is still correctly set"),
+
+ MochiKit.Base.noop
+ ], someTestArgs);
+ });
+
+ deferredResult.callback();
+
+ return deferredResult;
+ },
+
+ //-------------------------------------------------------------------------
+
+ 'editDirectLoginConfiguration_changingTheStructure_AndSaveChanges': function (someTestArgs) {
+ var deferredResult;
+ var proxy;
+ var user;
+ var user2;
+
+ var recordID = 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d';
+ var directLoginID = 'dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496';
+
+ proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, 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 'clipperz';}});
+
+ deferredResult = new Clipperz.Async.Deferred("Record.test.editDirectLoginConfiguration_changingTheStructure_AndSaveChanges", someTestArgs);
+ deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
+ deferredResult.addMethod(user, 'login');
+
+ deferredResult.addMethod(user, 'getRecord', recordID);
+ deferredResult.addMethodcaller('directLogins');
+ deferredResult.addCallback(MochiKit.Base.itemgetter(directLoginID));
+ deferredResult.addCallback(function (aDirectLogin) {
+ return Clipperz.Async.callbacks("Record.test.editDirectLoginConfiguration_changingTheStructure_AndSaveChanges [inner call 1]", [
+ MochiKit.Base.method(aDirectLogin, 'bookmarkletConfiguration'),
+ Clipperz.Async.Test.is(directLoginConfigurations['Yahoo! Mail'], "the current bookmarkletConfiguration (2)"),
+
+ MochiKit.Base.method(aDirectLogin, 'inputs'),
+ MochiKit.Base.keys,
+ MochiKit.Base.itemgetter('length'),
+ Clipperz.Async.Test.is(26, "The original direct login had 26 inputs"),
+
+ MochiKit.Base.method(aDirectLogin, 'bindings'),
+ MochiKit.Base.keys,
+ MochiKit.Base.itemgetter('length'),
+ Clipperz.Async.Test.is(2, "The original direct login had 2 inputs"),
+
+ MochiKit.Base.method(aDirectLogin, 'bindings'),
+ MochiKit.Base.itemgetter('login'),
+ MochiKit.Base.methodcaller('field'),
+ MochiKit.Base.methodcaller('reference'),
+ Clipperz.Async.Test.is('4cfaf1e782086e7527bd0e0cc82b67eb773e8157ad0c5babe516f7bc945a02a9', "the original 'login' direct login binding points to the correct field"),
+
+ MochiKit.Base.method(aDirectLogin, 'formValues'),
+ MochiKit.Base.keys,
+ MochiKit.Base.itemgetter('length'),
+ Clipperz.Async.Test.is(1, "The original direct login had 1 form values"),
+
+ MochiKit.Base.method(aDirectLogin, 'formValues'),
+ MochiKit.Base.itemgetter('.persistent'),
+ MochiKit.Base.methodcaller('value'),
+ Clipperz.Async.Test.is(null, "the original formValue is correct (2)"),
+
+
+ MochiKit.Base.method(aDirectLogin, 'setBookmarkletConfiguration', directLoginConfigurations['Parallels']),
+ MochiKit.Base.method(user, 'saveChanges'),
+
+ MochiKit.Base.method(aDirectLogin, 'inputs'),
+ MochiKit.Base.keys,
+ MochiKit.Base.itemgetter('length'),
+ Clipperz.Async.Test.is(2, "The new direct login has 2 inputs"),
+
+ MochiKit.Base.method(aDirectLogin, 'formValues'),
+ MochiKit.Base.keys,
+ MochiKit.Base.itemgetter('length'),
+ Clipperz.Async.Test.is(0, "The new direct login has no form values"),
+
+ MochiKit.Base.method(aDirectLogin, 'bindings'),
+ MochiKit.Base.keys,
+ MochiKit.Base.itemgetter('length'),
+ Clipperz.Async.Test.is(2, "The new direct login has 2 inputs"),
+
+ MochiKit.Base.method(aDirectLogin, 'bindings'),
+ MochiKit.Base.itemgetter('login'),
+ Clipperz.Async.Test.is(null, "the 'login' binding should not exist within the new configuration"),
+
+ MochiKit.Base.method(aDirectLogin, 'bindings'),
+ MochiKit.Base.itemgetter('passwd'),
+ Clipperz.Async.Test.is(null, "the 'passwd' binding should not exist within the new configuration"),
+
+ MochiKit.Base.method(aDirectLogin, 'bindings'),
+ MochiKit.Base.itemgetter('Email'),
+ Clipperz.Async.Test.ok("the 'Email' binding should exist within the new configuration"),
+
+ MochiKit.Base.method(aDirectLogin, 'bindings'),
+ MochiKit.Base.itemgetter('Password'),
+ Clipperz.Async.Test.ok("the 'Password' binding should exist within the new configuration"),
+
+
+ MochiKit.Base.method(aDirectLogin, 'bindings'),
+ MochiKit.Base.itemgetter('Email'),
+ MochiKit.Base.methodcaller('field'),
+ Clipperz.Async.Test.is(null, "the 'Email' binding should not point to any field, yet"),
+
+
+ MochiKit.Base.method(aDirectLogin, 'hasPendingChanges'),
+ Clipperz.Async.Test.fail("reverting changes should reset pending changes on the direct login (2)"),
+ MochiKit.Base.method(aDirectLogin.record(), 'hasPendingChanges'),
+ Clipperz.Async.Test.fail("reverting changes should reset pending changes also on the record (2)"),
+ MochiKit.Base.method(user, 'hasPendingChanges'),
+ Clipperz.Async.Test.fail("reverting changes should reset pending changes also on the user (2)"),
+
+ MochiKit.Base.noop
+ ], someTestArgs);
+ })
+
+ deferredResult.addMethod(user2, 'login');
+
+ deferredResult.addMethod(user2, 'getRecord', recordID);
+ deferredResult.addMethodcaller('directLogins');
+ deferredResult.addCallback(MochiKit.Base.itemgetter(directLoginID));
+ deferredResult.addCallback(function (aDirectLogin) {
+ return Clipperz.Async.callbacks("Record.test.editDirectLoginConfiguration_changingTheStructure_AndSaveChanges [inner call 2]", [
+ MochiKit.Base.method(aDirectLogin, 'bookmarkletConfiguration'),
+ Clipperz.Base.evalJSON,
+ MochiKit.Base.itemgetter('form'),
+ Clipperz.Async.Test.isDeeply(Clipperz.Base.evalJSON(directLoginConfigurations['Parallels'])['form'], "the direct login has the new bookmarkletConfiguration even after being reloaded"),
+
+ MochiKit.Base.method(aDirectLogin, 'inputs'),
+ MochiKit.Base.keys,
+ MochiKit.Base.itemgetter('length'),
+ Clipperz.Async.Test.is(2, "The new -reloaded- direct login has 2 inputs"),
+
+ MochiKit.Base.method(aDirectLogin, 'bindings'),
+ MochiKit.Base.keys,
+ MochiKit.Base.itemgetter('length'),
+ Clipperz.Async.Test.is(2, "The new direct login had 2 inputs"),
+
+ MochiKit.Base.method(aDirectLogin, 'bindings'),
+ MochiKit.Base.itemgetter('login'),
+ Clipperz.Async.Test.is(null, "the 'login' binding should not exist within the new configuration"),
+
+ MochiKit.Base.method(aDirectLogin, 'formValues'),
+ MochiKit.Base.keys,
+ MochiKit.Base.itemgetter('length'),
+ Clipperz.Async.Test.is(0, "The new direct login has no form values (2)"),
+
+ MochiKit.Base.noop
+ ], someTestArgs);
+ });
+
+ deferredResult.callback();
+
+ return deferredResult;
+ },
+
+ //-------------------------------------------------------------------------
+
+ 'editFieldValueAndRestoreIt': function (someTestArgs) {
+ var deferredResult;
+ var proxy;
+ var user;
+
+ var recordID = 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d';
+
+ proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, isDefault:true, readOnly:false});
+ user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
+
+ deferredResult = new Clipperz.Async.Deferred("Record.test.editValueAndRestoreIt", someTestArgs);
+ deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
+ deferredResult.addMethod(user, 'login');
+
+ deferredResult.addMethod(user, 'getRecord', recordID);
+ deferredResult.addMethodcaller('fields');
+ deferredResult.addCallback(MochiKit.Base.itemgetter('4cfaf1e782086e7527bd0e0cc82b67eb773e8157ad0c5babe516f7bc945a02a9'));
+ deferredResult.addMethodcaller('value');
+ deferredResult.addTest('joe.clipperz', "the current field value is 'joe.clipperz'");
+
+ deferredResult.addMethod(user, 'getRecord', recordID);
+ deferredResult.addMethodcaller('fields');
+ deferredResult.addCallback(MochiKit.Base.itemgetter('4cfaf1e782086e7527bd0e0cc82b67eb773e8157ad0c5babe516f7bc945a02a9'));
+ deferredResult.addMethodcaller('setValue', 'fake.clipperz');
+
+ deferredResult.addMethod(user, 'getRecord', recordID);
+ deferredResult.addMethodcaller('hasPendingChanges');
+ deferredResult.addTest(true, "changing the value of a field should trigger pending changes");
+
+ deferredResult.addMethod(user, 'getRecord', recordID);
+ deferredResult.addMethodcaller('fields');
+ deferredResult.addCallback(MochiKit.Base.itemgetter('4cfaf1e782086e7527bd0e0cc82b67eb773e8157ad0c5babe516f7bc945a02a9'));
+ deferredResult.addMethodcaller('setValue', 'joe.clipperz');
+
+ deferredResult.addMethod(user, 'getRecord', recordID);
+ deferredResult.addMethodcaller('hasPendingChanges');
+ deferredResult.addTest(false, "restoring the value of a field should revert pending changes");
+
+
+ deferredResult.callback();
+
+ return deferredResult;
+ },
+
+ //-------------------------------------------------------------------------
+
+ 'accessFieldValues': function (someTestArgs) {
+ var deferredResult;
+ var proxy;
+ var user;
+
+ var recordID = 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d';
+
+ proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, isDefault:true, readOnly:false});
+ user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
+
+ deferredResult = new Clipperz.Async.Deferred("Record.test.accessFieldValues", someTestArgs);
+ deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
+ deferredResult.addMethod(user, 'login');
+
+ deferredResult.addMethod(user, 'getRecord', recordID);
+ deferredResult.addMethodcaller('fieldWithLabel', 'userID');
+ deferredResult.addMethodcaller('value');
+ deferredResult.addTest('joe.clipperz', "the current field value is 'joe.clipperz'");
+
+
+ deferredResult.callback();
+
+ return deferredResult;
+ },
+
+ //-------------------------------------------------------------------------
+
+ 'editFieldValueAndSaveIt': function (someTestArgs) {
+ var deferredResult;
+ var proxy;
+ var user, user2;
+
+ var recordID = '2977aa5f99a9f6e5596c1bd7871e82d7328c3716c9ef8ba349ae65f10d97924e';
+ var passwordFieldID = '01e4bb6dcf054f312c535de8160bcf50bdccd664bdc05721b10d4e69583765f7';
+
+ proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, 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 'clipperz';}});
+
+ deferredResult = new Clipperz.Async.Deferred("Record.test.editValueAndRestoreIt", someTestArgs);
+// deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
+ deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_with_multipleRecordVersions_data']);
+ deferredResult.addMethod(user, 'login');
+
+ deferredResult.addMethod(user, 'getRecord', recordID);
+ deferredResult.addMethodcaller('getVersions');
+ deferredResult.addCallback(MochiKit.Base.keys);
+ deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
+ deferredResult.addTest(5, "the selected record has 5 versions");
+
+ deferredResult.addMethod(user, 'getRecord', recordID);
+ deferredResult.addMethodcaller('fields');
+ deferredResult.addCallback(MochiKit.Base.itemgetter(passwordFieldID));
+ deferredResult.collectResults({
+ 'label': MochiKit.Base.methodcaller('label'),
+ 'value': MochiKit.Base.methodcaller('value')
+ });
+ deferredResult.addTest({'label': 'password', 'value': 'HRRd7ycaFVG6'}, "the current field label and value match", true);
+
+ deferredResult.addMethod(user, 'getRecord', recordID);
+ deferredResult.addMethodcaller('fields');
+ deferredResult.addCallback(MochiKit.Base.itemgetter(passwordFieldID));
+ deferredResult.addMethodcaller('setValue', '<<pippo>>');
+
+ deferredResult.addMethod(user, 'getRecord', recordID);
+ deferredResult.addMethodcaller('hasPendingChanges');
+ deferredResult.addTest(true, "changing the value of a field should trigger pending changes");
+
+ deferredResult.addMethod(user, 'saveChanges');
+ deferredResult.addMethod(user, 'hasPendingChanges');
+ deferredResult.addTest(false, "after saving, there should be no pending changes");
+
+ deferredResult.addMethod(user, 'getRecord', recordID);
+ deferredResult.addMethodcaller('getVersions');
+ deferredResult.addCallback(MochiKit.Base.keys);
+ deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
+ deferredResult.addTest(6, "the selected record, after saving a new version, has now 6 versions");
+
+ deferredResult.addMethod(user2, 'login');
+
+ deferredResult.addMethod(user2, 'getRecord', recordID);
+ deferredResult.addMethodcaller('getVersions');
+ deferredResult.addCallback(MochiKit.Base.keys);
+ deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
+ deferredResult.addTest(6, "the selected record - reloaded from the db - has 6 versions");
+
+ deferredResult.addMethod(user2, 'getRecord', recordID);
+ deferredResult.addMethodcaller('fields');
+ deferredResult.addCallback(MochiKit.Base.itemgetter(passwordFieldID));
+ deferredResult.collectResults({
+ 'label': MochiKit.Base.methodcaller('label'),
+ 'value': MochiKit.Base.methodcaller('value')
+ });
+ deferredResult.addTest({'label': 'password', 'value': '<<pippo>>'}, "the current field label and value match", true);
+
+/*
+deferredResult.addCallback(function (aValue) { console.log("FIELDS", aValue); return aValue});
+
+ deferredResult.addMethod(user, 'getRecord', recordID);
+ deferredResult.addMethodcaller('fields');
+ deferredResult.addCallback(MochiKit.Base.itemgetter('4cfaf1e782086e7527bd0e0cc82b67eb773e8157ad0c5babe516f7bc945a02a9'));
+ deferredResult.addMethodcaller('setValue', 'joe.clipperz');
+
+ deferredResult.addMethod(user, 'getRecord', recordID);
+ deferredResult.addMethodcaller('hasPendingChanges');
+ deferredResult.addTest(false, "restoring the value of a field should revert pending changes");
+*/
+
+ deferredResult.callback();
+
+ return deferredResult;
+ },
+
+ //-------------------------------------------------------------------------
+
+ 'editNotesAndRestoreIt': function (someTestArgs) {
+ var deferredResult;
+ var proxy;
+ var user;
+
+ var recordID = 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d';
+
+ proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, isDefault:true, readOnly:false});
+ user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
+
+ deferredResult = new Clipperz.Async.Deferred("Record.test.editNotesAndRestoreIt", someTestArgs);
+ deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
+ deferredResult.addMethod(user, 'login');
+
+ deferredResult.addMethod(user, 'getRecord', recordID);
+ deferredResult.addMethodcaller('notes');
+ deferredResult.addTest('', "the current note is the empty string even if nothing is set on the record");
+
+ deferredResult.addMethod(user, 'getRecord', recordID);
+ deferredResult.addMethodcaller('setNotes', '');
+
+ deferredResult.addMethod(user, 'getRecord', recordID);
+ deferredResult.addMethodcaller('hasPendingChanges');
+ deferredResult.addTest(false, "setting notes to an empty string should be the same has not having the notes altogether");
+
+ deferredResult.callback();
+
+ return deferredResult;
+ },
+
+ //-------------------------------------------------------------------------
+
+ 'loadAllRecordVersions': function (someTestArgs) {
+ var deferredResult;
+ var proxy;
+ var user;
+
+ var recordID = '2977aa5f99a9f6e5596c1bd7871e82d7328c3716c9ef8ba349ae65f10d97924e';
+
+ proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, isDefault:true, readOnly:false});
+ user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
+
+ deferredResult = new Clipperz.Async.Deferred("Record.test.loadAllRecordVersions", someTestArgs);
+ deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_with_multipleRecordVersions_data']);
+ deferredResult.addMethod(user, 'login');
+
+ deferredResult.addMethod(user, 'getRecord', recordID);
+ deferredResult.addMethodcaller('label');
+ deferredResult.addTest('Amazon.com', "the selected record is the expected one");
+
+ deferredResult.addMethod(user, 'getRecord', recordID);
+ deferredResult.addMethodcaller('getVersions');
+ deferredResult.addCallback(MochiKit.Base.keys);
+ deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
+ deferredResult.addTest(5, "the 'Amazon' record has 5 versions");
+
+ deferredResult.addMethod(user, 'getRecord', recordID);
+ deferredResult.addMethodcaller('getCurrentRecordVersion');
+ deferredResult.addMethodcaller('fields');
+ deferredResult.addCallback(MochiKit.Base.keys);
+ deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
+ deferredResult.addTest(3, "the current version of 'Amazon' record has 3 fields");
+
+ deferredResult.callback();
+
+ return deferredResult;
+ },
+
+ //-------------------------------------------------------------------------
+
+ 'createDirectLoginAndDeleteItAfterward': function (someTestArgs) {
+ var deferredResult;
+ var proxy;
+ var user, user2;
+ var recordID = 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d'; // YAHOO (4)
+ var directLoginReference;
+
+ proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, 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 'clipperz';}});
+
+ deferredResult = new Clipperz.Async.Deferred("Record.test.addDirectLoginAndRevertChanges", someTestArgs);
+ deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
+ deferredResult.addMethod(user, 'login');
+
+ deferredResult.addMethod(user, 'getRecord', recordID);
+ deferredResult.setValue('record');
+ deferredResult.addMethodcaller('directLogins');
+ deferredResult.addCallback(MochiKit.Base.keys);
+ deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
+ deferredResult.addTest(4, "the record, when initially loaded, has 4 direct logins");
+
+ deferredResult.getValue('record');
+ deferredResult.addMethodcaller('createNewDirectLogin');
+ deferredResult.setValue('directLogin');
+
+ deferredResult.getValue('directLogin');
+ deferredResult.addMethodcaller('setLabel', "New direct login");
+
+ deferredResult.getValue('directLogin');
+ deferredResult.addMethodcaller('setBookmarkletConfiguration', '{"page": {"title": "Parallels Account"}, "form": {"attributes": {"action": "https://www.parallels.com/account/", "method": "post"}, "inputs": [{"type": "text", "name": "Email", "value": ""}, {"type": "password", "name": "Password", "value": ""}]}, "version": "0.2.3"}');
+
+ deferredResult.getValue('directLogin');
+ deferredResult.addMethodcaller('remove');
+
+ deferredResult.addMethod(user, 'hasPendingChanges');
+ deferredResult.addTest(false, "after reverting the changes, the user should NOT have pending changes");
+
+ deferredResult.callback();
+
+ return deferredResult;
+ },
+
+ //-------------------------------------------------------------------------
+
+ 'syntaxFix': MochiKit.Base.noop
+};
+
+
+
+//#############################################################################
+
+SimpleTest.runDeferredTests("Clipperz.PM.DataModel.Record", tests, {trace:false});