UNPKG

gpii-universal

Version:

Cross platform, core components of the GPII personalization infrastructure.

801 lines (781 loc) 34.4 kB
/* * User Logon Request Test Definitions * * Copyright 2018-2019 OCAD University * * Licensed under the New BSD license. You may not use this file except in * compliance with this License. * * You may obtain a copy of the License at * https://github.com/GPII/universal/blob/master/LICENSE.txt */ "use strict"; var fluid = require("infusion"), jqUnit = fluid.require("node-jqunit", require, "jqUnit"), gpii = fluid.registerNamespace("gpii"); fluid.require("%gpii-universal"); gpii.loadTestingSupport(); fluid.registerNamespace("gpii.tests.userLogonRequest"); gpii.tests.userLogonRequest.gpiiKey = "adjustCursor"; gpii.tests.userLogonRequest.anotherGpiiKey = "sammy"; fluid.defaults("gpii.tests.userLogonRequest.testCaseHolder", { gradeNames: ["gpii.test.common.lifecycleManagerReceiver", "gpii.test.testCaseHolder"], events: { onNoUserLoggedIn: null, debounceTimeoutComplete: null }, expectedModelChanges: { proximityTriggeredLogon: [ { type: "logout", inProgress: true, gpiiKey: "noUser" }, { type: "logout", inProgress: false, gpiiKey: "noUser" }, { type: "login", inProgress: true, gpiiKey: gpii.tests.userLogonRequest.gpiiKey }, { type: "login", inProgress: false, gpiiKey: gpii.tests.userLogonRequest.gpiiKey } ], proximityTriggeredLogout: [ { type: "logout", inProgress: true, gpiiKey: gpii.tests.userLogonRequest.gpiiKey }, { type: "logout", inProgress: false, gpiiKey: gpii.tests.userLogonRequest.gpiiKey }, { type: "login", inProgress: true, gpiiKey: "noUser" }, { type: "login", inProgress: false, gpiiKey: "noUser" } ], logoutNoUser: [ { type: "logout", inProgress: true, gpiiKey: "noUser" }, { type: "logout", inProgress: false, gpiiKey: "noUser" }, { type: "login", inProgress: true, gpiiKey: "noUser" }, { type: "login", inProgress: false, gpiiKey: "noUser" } ], secondProximityTriggered: [ { type: "logout", inProgress: true, gpiiKey: gpii.tests.userLogonRequest.gpiiKey }, { type: "logout", inProgress: false, gpiiKey: gpii.tests.userLogonRequest.gpiiKey }, { type: "login", inProgress: true, gpiiKey: gpii.tests.userLogonRequest.anotherGpiiKey }, { type: "login", inProgress: false, gpiiKey: gpii.tests.userLogonRequest.anotherGpiiKey } ], resetLogout: [ { type: "logout", inProgress: true, gpiiKey: gpii.tests.userLogonRequest.gpiiKey }, { type: "logout", inProgress: false, gpiiKey: gpii.tests.userLogonRequest.gpiiKey }, { type: "login", inProgress: true, gpiiKey: "noUser" }, { type: "login", inProgress: false, gpiiKey: "noUser" } ], noUserLogin: [ { type: "login", inProgress: true, gpiiKey: "noUser" }, { type: "login", inProgress: false, gpiiKey: "noUser" } ] } }); gpii.tests.userLogonRequest.verifyActiveGpiiKey = function (lifecycleManager, expected) { jqUnit.assertDeepEq("The current active GPII key is as expected - " + expected, expected, lifecycleManager.getActiveSessionGpiiKey()); }; gpii.tests.userLogonRequest.testLoginResponse = function (data, gpiiKey) { jqUnit.assertEquals("Response is correct", "User with GPII key " + gpiiKey + " was successfully logged in.", data); }; gpii.tests.userLogonRequest.testLogoutResponse = function (data, gpiiKey) { jqUnit.assertEquals("Response is correct", "User with GPII key " + gpiiKey + " was successfully logged out.", data); }; gpii.tests.userLogonRequest.testResetResponse = function (data) { jqUnit.assertEquals("Response is correct", "Reset successfully.", data); }; gpii.tests.userLogonRequest.checkLastModelChanges = function (trackedLogonChange, expectedModelChanges) { var sliceToInspect = trackedLogonChange.slice(trackedLogonChange.length - expectedModelChanges.length); fluid.each(expectedModelChanges, function (expectedModelChange, index) { var actualChange = sliceToInspect[index]; jqUnit.assertLeftHand("Checking model change " + index, expectedModelChange, actualChange); }); }; gpii.tests.userLogonRequest.testUserError = function (actualResponse, expectedResponse, userError, expectedUserError) { jqUnit.assertDeepEq("onError fires with the expected message", expectedResponse, actualResponse); jqUnit.assertDeepEq("User error has been fired with the expected content", expectedUserError, userError.error); }; gpii.tests.userLogonRequest.testLogoutError = function (actualError, userError, expectedError) { jqUnit.assertDeepEq("onError fires with the expected message", expectedError, actualError); if (actualError.ignoreUserErrors) { jqUnit.assertDeepEq("User error has not be fired", {}, userError); } else { var userErrorMessage = userError.error.originalError; jqUnit.assertDeepEq("User error has been fired with the expected message", actualError.message, userErrorMessage); } }; gpii.tests.userLogonRequest.commonTestConfig = { gradeNames: ["gpii.tests.userLogonRequest.testCaseHolder", "gpii.test.integration.testCaseHolder.linux"], distributeOptions: { "lifecycleManager.userErrorsListener": { "record": { trackedUserErrors: {}, listeners: { "userError.trackReportedError": { listener: "fluid.set", args: ["{that}.options.trackedUserErrors", "error", "{arguments}.0"] } } }, "target": "{that gpii.flowManager.local userErrors}.options" } } }; gpii.tests.userLogonRequest.buildTestDefs = function (testDefs, testType) { var config = { // The custom config file is to config the debounce time at proximityTriggered endpoint to 3 seconds // rather than using the default 1.5 seconds. This is to work around an issue with testing a following // request that occurs < the debounce time. In this test, the following request was sent after waiting // for 1 second. However in the reality with all other running processes, CPU processing power etc, // this request is usually sent a bit more than after 1 second, occassionally even more than 1.5 seconds, // which causes the test to fail. Setting the debounce time to 3 seconds provides more buffering time // for the following request to send. configName: testType === "untrusted" ? "gpii.tests.acceptance.untrusted.userLogon.config" : "gpii.tests.acceptance.userLogon.config", configPath: "%gpii-universal/tests/configs" }; return fluid.transform(testDefs, function (testDef) { return fluid.extend(true, { config: config, gpiiKey: testDefs.gpiiKey || gpii.tests.userLogonRequest.gpiiKey, distributeOptions: { "lifecycleManager.logonChangeListener": { "record": { trackedLogonChange: [], modelListeners: { "logonChange": { listener: "gpii.tests.userLogonRequest.trackLogonChange", args: ["{that}.options.trackedLogonChange", "{change}.value", "{testCaseHolder}"] } } }, "target": "{that gpii.flowManager.local lifecycleManager}.options" } } }, gpii.tests.userLogonRequest.commonTestConfig, testDef); }); }; gpii.tests.userLogonRequest.trackLogonChange = function (trackedLogonChange, logonChange) { trackedLogonChange.push(logonChange); }; // Note: There is an implementation risk with this fixture due to FLUID-5502 (https://issues.fluidproject.org/browse/FLUID-5502) // but we believe that this is currently reliable because each of the model changes is triggered asynchronously. gpii.tests.userLogonRequest.testDefs = [ { name: "Testing standard proximityTriggered login and logout", expect: 13, sequence: [ { // The initial active GPII key is "noUser" func: "gpii.tests.userLogonRequest.verifyActiveGpiiKey", args: ["{lifecycleManager}", "noUser"] }, { // 1. First proximityTriggered request to key in adjustCursor task: "{lifecycleManager}.performProximityTriggered", args: [gpii.tests.userLogonRequest.gpiiKey], resolve: "gpii.tests.userLogonRequest.testLoginResponse", resolveArgs: ["{arguments}.0", gpii.tests.userLogonRequest.gpiiKey] }, { funcName: "gpii.tests.userLogonRequest.checkLastModelChanges", args: ["{lifecycleManager}.options.trackedLogonChange", "{that}.options.expectedModelChanges.proximityTriggeredLogon"] // trackedLogonChange, expectedModelChanges) }, { func: "gpii.tests.userLogonRequest.verifyActiveGpiiKey", args: ["{lifecycleManager}", gpii.tests.userLogonRequest.gpiiKey] }, { // 2. wait for the debounce period to pass so that the following proximityTriggered request is not rejected func: "setTimeout", args: ["{tests}.events.debounceTimeoutComplete.fire", 3500] }, { event: "{tests}.events.debounceTimeoutComplete", listener: "fluid.identity" }, { // 3. 2nd proximityTriggered request to key out adjustCursor task: "{lifecycleManager}.performProximityTriggered", args: [gpii.tests.userLogonRequest.gpiiKey], resolve: "gpii.tests.userLogonRequest.testLogoutResponse", resolveArgs: ["{arguments}.0", gpii.tests.userLogonRequest.gpiiKey] }, { event: "{lifecycleManager}.events.onQueueEmpty", listener: "gpii.tests.userLogonRequest.verifyActiveGpiiKey", args: ["{lifecycleManager}", "noUser"] }, { funcName: "gpii.tests.userLogonRequest.checkLastModelChanges", args: ["{lifecycleManager}.options.trackedLogonChange", "{that}.options.expectedModelChanges.proximityTriggeredLogout"] // trackedLogonChange, expectedModelChanges) } ] }, { name: "Login with a different user with proximity trigger should log previous user out and noUser does not login in between", expect: 7, sequence: [ { // 1. First proximityTriggered request to key in adjustCursor task: "{lifecycleManager}.performProximityTriggered", args: [gpii.tests.userLogonRequest.gpiiKey], resolve: "gpii.tests.userLogonRequest.testLoginResponse", resolveArgs: ["{arguments}.0", gpii.tests.userLogonRequest.gpiiKey] }, { // 2. wait for the debounce period to pass func: "setTimeout", args: ["{tests}.events.debounceTimeoutComplete.fire", 3500] }, { event: "{tests}.events.debounceTimeoutComplete", listener: "fluid.identity" }, { // 3. 2nd proximityTriggered request to key in another key "sammy". This should trigger: // 1) key out the first key "adjustCursor"; // 2) key in the 2nd key "sammy"; // 3) "noUser" is not keyed in between step 1 and 2. task: "{lifecycleManager}.performProximityTriggered", args: [gpii.tests.userLogonRequest.anotherGpiiKey], resolve: "gpii.tests.userLogonRequest.testLoginResponse", resolveArgs: ["{arguments}.0", gpii.tests.userLogonRequest.anotherGpiiKey] }, { event: "{lifecycleManager}.events.onQueueEmpty", listener: "gpii.tests.userLogonRequest.verifyActiveGpiiKey", args: ["{lifecycleManager}", gpii.tests.userLogonRequest.anotherGpiiKey] }, { funcName: "gpii.tests.userLogonRequest.checkLastModelChanges", args: ["{lifecycleManager}.options.trackedLogonChange", "{that}.options.expectedModelChanges.secondProximityTriggered"] // trackedLogonChange, expectedModelChanges) } ] }, { name: "Login with a different user with proximity trigger should ignore debounce", expect: 2, sequence: [ { // 1. 1nd proximityTriggered request to key in adjustCursor task: "{lifecycleManager}.performProximityTriggered", args: [gpii.tests.userLogonRequest.gpiiKey], resolve: "gpii.tests.userLogonRequest.testLoginResponse", resolveArgs: ["{arguments}.0", gpii.tests.userLogonRequest.gpiiKey] }, { // 2. wait within the debounce period func: "setTimeout", args: ["{tests}.events.debounceTimeoutComplete.fire", 10] }, { event: "{tests}.events.debounceTimeoutComplete", listener: "fluid.identity" }, { // 3. 2nd proximityTriggered request to key in with a different user task: "{lifecycleManager}.performProximityTriggered", args: [gpii.tests.userLogonRequest.anotherGpiiKey], resolve: "gpii.tests.userLogonRequest.testLoginResponse", resolveArgs: ["{arguments}.0", gpii.tests.userLogonRequest.anotherGpiiKey] } ] }, { name: "Testing proximityTriggered login with debounce", expect: 2, sequence: [ { // 1. 1nd proximityTriggered request to key in adjustCursor task: "{lifecycleManager}.performProximityTriggered", args: [gpii.tests.userLogonRequest.gpiiKey], resolve: "gpii.tests.userLogonRequest.testLoginResponse", resolveArgs: ["{arguments}.0", gpii.tests.userLogonRequest.gpiiKey] }, { // 2. wait within the debounce period to trigger the debounce logic so that the following proximityTriggered request will be rejected func: "setTimeout", args: ["{tests}.events.debounceTimeoutComplete.fire", 10] }, { event: "{tests}.events.debounceTimeoutComplete", listener: "fluid.identity" }, { // 1. 2nd proximityTriggered request to key out adjustCursor task: "{lifecycleManager}.performProximityTriggered", args: [gpii.tests.userLogonRequest.gpiiKey], reject: "jqUnit.assertDeepEq", rejectArgs: ["Proximity trigger ignored due to bounce rules", { "statusCode": 429, "message": "Proximity trigger ignored due to bounce rules. Please wait current logon change is complete", "ignoreUserErrors": false }, "{arguments}.0"] } ] }, { name: "Testing proximityTriggered logout with debounce", expect: 3, sequence: [ { // 1. 1nd proximityTriggered request to key in adjustCursor task: "{lifecycleManager}.performProximityTriggered", args: [gpii.tests.userLogonRequest.gpiiKey], resolve: "gpii.tests.userLogonRequest.testLoginResponse", resolveArgs: ["{arguments}.0", gpii.tests.userLogonRequest.gpiiKey] }, { // 2. wait for the debounce period to pass so that the following proximityTriggered request is not rejected func: "setTimeout", args: ["{tests}.events.debounceTimeoutComplete.fire", 3500] }, { event: "{tests}.events.debounceTimeoutComplete", listener: "fluid.identity" }, { // 3. 2nd proximityTriggered request: standard logout task: "{lifecycleManager}.performProximityTriggered", args: [gpii.tests.userLogonRequest.gpiiKey], resolve: "gpii.tests.userLogonRequest.testLogoutResponse", resolveArgs: ["{arguments}.0", gpii.tests.userLogonRequest.gpiiKey] }, { // 4. wait within the debounce period to trigger the debounce logic so that the following proximityTriggered request with the same GPII key will be rejected // use 1000ms to allow a buffer time for "noUser" login after the logout above to complete. func: "setTimeout", args: ["{tests}.events.debounceTimeoutComplete.fire", 1000] }, { event: "{tests}.events.debounceTimeoutComplete", listener: "fluid.identity" }, { // 5. 3rd proximityTriggered request with the same GPII key: will be rejected task: "{lifecycleManager}.performProximityTriggered", args: [gpii.tests.userLogonRequest.gpiiKey], reject: "jqUnit.assertDeepEq", rejectArgs: ["Proximity trigger ignored due to bounce rules", { "statusCode": 429, "message": "Proximity trigger ignored due to bounce rules. Please wait current logon change is complete", "ignoreUserErrors": false }, "{arguments}.0"] } ] }, { name: "Testing 'reset' GPII key: resetting with noUser logs out noUser", expect: 3, sequence: [ { task: "{lifecycleManager}.performProximityTriggered", args: ["reset"], resolve: "gpii.tests.userLogonRequest.testResetResponse", resolveArgs: ["{arguments}.0"] }, { event: "{lifecycleManager}.events.onQueueEmpty", listener: "gpii.tests.userLogonRequest.checkLastModelChanges", args: ["{lifecycleManager}.options.trackedLogonChange", "{that}.options.expectedModelChanges.noUserLogin"] // trackedLogonChange, expectedModelChanges) } ] }, { name: "Testing 'reset' GPII key: resetting with a user logged in", expect: 9, initialState: { "gpii.gsettings.launch": { "org.gnome.desktop.a11y.magnifier": [{ "settings": { "running": true }, "options": { "schema": "org.gnome.desktop.a11y.applications", "key": "screen-magnifier-enabled" } }] } }, expectedStateAfterReset: { "gpii.gsettings.launch": { "org.gnome.desktop.a11y.magnifier": [{ "settings": { "running": false }, "options": { "schema": "org.gnome.desktop.a11y.applications", "key": "screen-magnifier-enabled" } }] }, "gpii.gsettings": { "data": [{ "settings": { "cursor-size": 29 }, "options": { "schema": "org.gnome.desktop.interface" } }] }, "gpii.alsa": { "data": [{ "settings": { "masterVolume": 75 } }] } }, sequence: [ { // 1. set the initial settings: start the magnifier func: "gpii.test.expandSettings", args: ["{tests}", "initialState"] }, { func: "gpii.test.setInitialSettingsState", args: ["{tests}.initialState", "{nameResolver}", "{testCaseHolder}.events.onInitialStateSet.fire"] }, { event: "{testCaseHolder}.events.onInitialStateSet", listener: "fluid.identity" }, { func: "gpii.test.checkConfiguration", args: ["{tests}.initialState", "{nameResolver}", "{testCaseHolder}.events.onInitialStateConfirmed.fire", "Confirming initial state"] }, { event: "{testCaseHolder}.events.onInitialStateConfirmed", listener: "fluid.identity" }, { // 2. login task: "{lifecycleManager}.performProximityTriggered", args: [gpii.tests.userLogonRequest.gpiiKey], resolve: "gpii.tests.userLogonRequest.testLoginResponse", resolveArgs: ["{arguments}.0", gpii.tests.userLogonRequest.gpiiKey] }, { // 3. reset and check that user is logged out) task: "{lifecycleManager}.performProximityTriggered", args: ["reset"], resolve: "gpii.tests.userLogonRequest.testResetResponse", resolveArgs: ["{arguments}.0"] }, { event: "{lifecycleManager}.events.onQueueEmpty", listener: "gpii.tests.userLogonRequest.verifyActiveGpiiKey", args: ["{lifecycleManager}", "noUser"] }, { funcName: "gpii.tests.userLogonRequest.checkLastModelChanges", args: ["{lifecycleManager}.options.trackedLogonChange", "{that}.options.expectedModelChanges.resetLogout"] // trackedLogonChange, expectedModelChanges) }, { // 6. Verify the default settings have been applied: stop the magnifier func: "gpii.test.checkRestoredInitialState", args: ["{tests}.options.expectedStateAfterReset", "{nameResolver}", "{testCaseHolder}.events.onCheckRestoredInitialStateComplete.fire"] }, { event: "{testCaseHolder}.events.onCheckRestoredInitialStateComplete", listener: "fluid.identity" } ] }, { name: "Testing standard user/<gpiiKey>/login and /user/<gpiiKey>/logout URLs", expect: 9, initialState: { "gpii.gsettings": { "data": [{ "settings": { "cursor-size": 29 }, "options": { "schema": "org.gnome.desktop.interface" } }] }, "gpii.alsa": { "data": [{ "settings": { "masterVolume": 75 } }] } }, expectedState: { "gpii.gsettings": { "data": [{ "settings": { "cursor-size": 41 }, "options": { "schema": "org.gnome.desktop.interface" } }] }, "gpii.alsa": { "data": [{ "settings": { "masterVolume": 75 } }] } }, sequence: [ { // standard login task: "{lifecycleManager}.performLogin", args: [gpii.tests.userLogonRequest.gpiiKey], resolve: "gpii.tests.userLogonRequest.testLoginResponse", resolveArgs: ["{arguments}.0", gpii.tests.userLogonRequest.gpiiKey] }, { // standard login completes: Verify both key-in settings and default settings for reset have been applied event: "{lifecycleManager}.events.onQueueEmpty", listener: "gpii.test.checkRestoredInitialState", args: ["{tests}.options.expectedState", "{nameResolver}", "{testCaseHolder}.events.onCheckRestoredInitialStateComplete.fire"] }, { event: "{testCaseHolder}.events.onCheckRestoredInitialStateComplete", listener: "fluid.identity" }, { // standard login with an already logged in user: task: "{lifecycleManager}.performLogin", args: [gpii.tests.userLogonRequest.anotherGpiiKey], resolve: "gpii.tests.userLogonRequest.testLoginResponse", resolveArgs: ["{arguments}.0", gpii.tests.userLogonRequest.anotherGpiiKey] }, { event: "{lifecycleManager}.events.onQueueEmpty", listener: "fluid.identity" }, { // logout of different user task: "{lifecycleManager}.performLogout", args: [gpii.tests.userLogonRequest.gpiiKey], reject: "gpii.tests.userLogonRequest.testLogoutError", rejectArgs: ["{arguments}.0", "{lifecycleManager}.userErrors.options.trackedUserErrors", { "statusCode": 409, "message": "Got logout request from user adjustCursor, but the user sammy is logged in. So ignoring the request.", "ignoreUserErrors": false }] }, { // logout of the correct user task: "{lifecycleManager}.performLogout", args: [gpii.tests.userLogonRequest.anotherGpiiKey], resolve: "gpii.tests.userLogonRequest.testLogoutResponse", resolveArgs: ["{arguments}.0", gpii.tests.userLogonRequest.anotherGpiiKey] }, { event: "{lifecycleManager}.events.onQueueEmpty", listener: "gpii.tests.userLogonRequest.verifyActiveGpiiKey", args: ["{lifecycleManager}", "noUser"] }, { funcName: "gpii.tests.userLogonRequest.checkLastModelChanges", args: ["{lifecycleManager}.options.trackedLogonChange", "{that}.options.expectedModelChanges.noUserLogin"] // trackedLogonChange, expectedModelChanges) } ] }, { name: "GPII-3481: /user/<gpiiKey>/logout does not trigger the user error report when the current logged in user is noUser", expect: 2, sequence: [ { // logout of user when none is logged in task: "{lifecycleManager}.performLogout", args: [gpii.tests.userLogonRequest.gpiiKey], reject: "gpii.tests.userLogonRequest.testLogoutError", rejectArgs: ["{arguments}.0", "{lifecycleManager}.userErrors.options.trackedUserErrors", { "statusCode": 409, "message": "Got logout request from user adjustCursor, but the user noUser is logged in. So ignoring the request.", "ignoreUserErrors": true }, "{arguments}.0"] } ] }, { name: "noUser logs back in after an explicit request to logout noUser", expect: 7, sequence: [ { // 1. "noUser" is keyed in initially func: "gpii.tests.userLogonRequest.verifyActiveGpiiKey", args: ["{lifecycleManager}", "noUser"] }, { // 2. explicitly key out "noUser" task: "{lifecycleManager}.performLogout", args: ["noUser"], resolve: "gpii.tests.userLogonRequest.testLogoutResponse", resolveArgs: ["{arguments}.0", "noUser"] }, { event: "{lifecycleManager}.events.onQueueEmpty", listener: "gpii.tests.userLogonRequest.verifyActiveGpiiKey", args: ["{lifecycleManager}", "noUser"] }, { funcName: "gpii.tests.userLogonRequest.checkLastModelChanges", args: ["{lifecycleManager}.options.trackedLogonChange", "{that}.options.expectedModelChanges.logoutNoUser"] // trackedLogonChange, expectedModelChanges) } ] }, { name: "GPII-3988: Replay environmental login to support \"My Saved Settings\"", expect: 10, sequence: [ { // standard login task: "{lifecycleManager}.performLogin", args: [gpii.tests.userLogonRequest.gpiiKey, { isEnvironmentalLogin: true }], resolve: "gpii.tests.userLogonRequest.testLoginResponse", resolveArgs: ["{arguments}.0", gpii.tests.userLogonRequest.gpiiKey] }, { funcName: "jqUnit.assertEquals", args: ["The GPII key of the environmental login has been saved into the model", gpii.tests.userLogonRequest.gpiiKey, "{lifecycleManager}.model.lastEnvironmentalLoginGpiiKey"] }, { // The replay of the last environmental login is accepted when the active GPII key is the same key // stored for the replay task: "{lifecycleManager}.replayEnvironmentalLogin", resolve: "gpii.tests.userLogonRequest.testLoginResponse", resolveArgs: ["{arguments}.0", gpii.tests.userLogonRequest.gpiiKey] }, { // Logout of the current user task: "{lifecycleManager}.performLogout", args: [gpii.tests.userLogonRequest.gpiiKey], resolve: "gpii.tests.userLogonRequest.testLogoutResponse", resolveArgs: ["{arguments}.0", gpii.tests.userLogonRequest.gpiiKey] }, { event: "{lifecycleManager}.events.onQueueEmpty", listener: "gpii.tests.userLogonRequest.verifyActiveGpiiKey", args: ["{lifecycleManager}", "noUser"] }, { // The replay of the last environmental login is accepted when the active GPII key is "noUser" task: "{lifecycleManager}.replayEnvironmentalLogin", resolve: "gpii.tests.userLogonRequest.testLoginResponse", resolveArgs: ["{arguments}.0", gpii.tests.userLogonRequest.gpiiKey] }, { // Logout of the current user task: "{lifecycleManager}.performLogout", args: [gpii.tests.userLogonRequest.gpiiKey], resolve: "gpii.tests.userLogonRequest.testLogoutResponse", resolveArgs: ["{arguments}.0", gpii.tests.userLogonRequest.gpiiKey] }, { // Login a different GPII key as a non-environmental login task: "{lifecycleManager}.performLogin", args: [gpii.tests.userLogonRequest.anotherGpiiKey], resolve: "gpii.tests.userLogonRequest.testLoginResponse", resolveArgs: ["{arguments}.0", gpii.tests.userLogonRequest.anotherGpiiKey] }, { // Ensure the model value that saves the GPII key of the last environmental login stays unchanged funcName: "jqUnit.assertEquals", args: ["The GPII key of the last environmental login stays unchanged in the model", gpii.tests.userLogonRequest.gpiiKey, "{lifecycleManager}.model.lastEnvironmentalLoginGpiiKey"] }, { // The replay of the last environmental login is rejected when the active GPII key is different from // the GPII key saved for the last environmental login. task: "{lifecycleManager}.replayEnvironmentalLogin", reject: "jqUnit.assertDeepEq", rejectArgs: ["Proximity trigger ignored due to bounce rules", { "isError": true, "message": "Replay environmental login ignored because the current active GPII key is not \"noUser\" or the last GPII key used for the environmental login" }, "{arguments}.0"] } ] } ];