App-Dochazka-WWW

 view release on metacpan or  search on metacpan

Changes  view on Meta::CPAN

- tests: js: first dochazka-www unit test
- tests: js: migrate unit test to QUnit 2.4.0
- build/ops: require App::MFILE::WWW 0.158

0.149 2017-09-24 00:03 CEST
- build/ops: add ext/codepaths file to MANIFEST
- js: tests: add simple test cases for mainMenu targets
- Dispatch.pm: upon login success, expurgate currentUser object
- js: tests: force root user for mainMenu test
- js: tests: refactor and add test for mainEmpl menu
- js: tests: use setTimeout properly
- js: tests/main-menu.js: refactor to do login/logout
- Dispatch.pm: use _prep_ajax_response for logout
- daction-start.js: call loggout instead of logout
- tests/main-menu.js: use current user object correctly
- js: tests: refactor all three existing tests

0.150 2017-09-25 17:36 CEST
- js: emp-lib: migrate ldapLookupSubmit() to target stack
- js: tests: add LDAP lookup test case
- js: tests: put focus on selection field when populating it

share/js/dochazka-www/tests/01-users.js  view on Meta::CPAN

        test_desc;

    return function () {

        test_desc = 'create "active" and "inactive" users if necessary';
        QUnit.test(test_desc, function (assert) {
            console.log('***TEST*** ' + prefix + test_desc);
            var done = assert.async(6);
            assert.expect(25);
            login({"nam": "root", "pwd": "immutable"});
            setTimeout(function () {
                ct.login(assert, "root", "admin");
                done();
            }, 1000);
            setTimeout(function () {
                ct.mainMenu(assert);
                done();
            }, 2000);
            setTimeout(function () {
                // create the employees
                ct.employeeCreate(assert, "active");
                ct.employeeCreate(assert, "inactive");
                done();
            }, 2400);
            setTimeout(function () {
                // add privhistory records
                ct.employeePriv(assert, "active", "active");
                ct.employeePriv(assert, "inactive", "inactive");
                done();
            }, 2800);
            setTimeout(function () {
                // assert that employees have expected privlevels
                ct.employeeHasPriv(assert, "active", "active");
                ct.employeeHasPriv(assert, "inactive", "inactive");
                loggout();
                done();
            }, 3200);
            setTimeout(function () {
                ct.loggout(assert);
                done();
            }, 3600);
        });

    };

});

share/js/dochazka-www/tests/ldap.js  view on Meta::CPAN

    var prefix = "dochazka-www: ",
        test_desc;

    return function () {

        test_desc = 'LDAP lookup - success';
        QUnit.test(test_desc, function (assert) {
            console.log('***TEST*** ' + prefix + test_desc);
            var done = assert.async(4);
            login({"nam": "root", "pwd": "immutable"});
            setTimeout(function () {
                ct.login(assert, "root", "admin");
                ct.mainMenuToMainEmpl(assert);
                ct.mainEmplToLdapLookup(assert);
                ct.submitLdapLookup(assert, 'ncutler');
                done();
            }, 1000);
            setTimeout(function () {
                var ldapDochazka;
                ct.stack(
                    assert,
                    4,
                    'Displaying LDAP employee after successful LDAP lookup',
                    'dform',
                    'ldapDisplayEmployee',
                );
                ct.mainareaForm(assert, 'ldapDisplayEmployee');
                assert.strictEqual(

share/js/dochazka-www/tests/ldap.js  view on Meta::CPAN

                    "0. LDAP sync",
                );
                assert.ok(true, "*** REACHED miniMenu contains 0. LDAP sync");
                // choose '0' for ldapSync
                $('input[name="sel"]').val('0');
                $('input[name="sel"]').focus();
                start.mmKeyListener($.Event("keydown", {keyCode: 13}));
                assert.ok(true, "*** REACHED pressed 0 for LDAP sync");
                done();
            }, 3000);
            setTimeout(function () {
                var ldapDochazka = $('#LDAPdochazka').text();
                ct.stack(
                    assert,
                    4,
                    'Displaying LDAP employee after successful LDAP lookup',
                    'dform',
                    'ldapDisplayEmployee',
                );
                ct.mainareaForm(assert, 'ldapDisplayEmployee');
                assert.ok(ldapDochazka, "ncutler is in Dochazka already? " + ldapDochazka);

share/js/dochazka-www/tests/ldap.js  view on Meta::CPAN

                    assert,
                    2,
                    'After selecting X in ldapLookup',
                    'dmenu',
                    'mainEmpl'
                );
                assert.ok(true, "*** REACHED mainEmpl dmenu via X from ldapLookup");
                loggout();
                done();
            }, 4500);
            setTimeout(function () {
                ct.loggout(assert);
                done();
            }, 5500);
        });

        test_desc = 'LDAP lookup - failure';
        QUnit.test(test_desc, function (assert) {
            console.log('***TEST*** ' + prefix + test_desc);
            var done = assert.async(4);
            login({"nam": "root", "pwd": "immutable"});
            setTimeout(function () {
                ct.login(assert, "root", "admin");
                ct.mainMenuToMainEmpl(assert);
                ct.mainEmplToLdapLookup(assert);
                ct.submitLdapLookup(assert, 'NONEXISTENTfoobarbazblatFISHBEAR');
                done();
            }, 1000);
            setTimeout(function () {
                ct.stack(
                    assert,
                    3,
                    'failed LDAP lookup',
                    'dform',
                    'ldapLookup',
                );
                ct.contains(
                    assert,
                    $("#result").html(),

share/js/dochazka-www/tests/ldap.js  view on Meta::CPAN

                    "Employee not found in LDAP",
                );
                assert.strictEqual(
                    coreLib.focusedItem().name,
                    'entry0',
                    'Focus is on data entry field',
                );
                ct.submitLdapLookup(assert, 'NONEXISTENTpseudoDataEntered');
                done();
            }, 3000);
            setTimeout(function () {
                ct.stack(
                    assert,
                    3,
                    'failed LDAP lookup',
                    'dform',
                    'ldapLookup',
                );
                ct.contains(
                    assert,
                    $("#result").html(),

share/js/dochazka-www/tests/ldap.js  view on Meta::CPAN

                    "Employee not found in LDAP",
                );
                assert.strictEqual(
                    coreLib.focusedItem().name,
                    'entry0',
                    'Focus is on data entry field',
                );
                loggout();
                done();
            }, 4000);
            setTimeout(function () {
                ct.loggout(assert);
                done();
            }, 5000);
        });

    };
});

share/js/dochazka-www/tests/main-empl.js  view on Meta::CPAN

        test_desc;

    return function () {

        test_desc = 'employee profile - passerby';
        QUnit.test(test_desc, function (assert) {
            var done = assert.async(4),
                fullProfile;
            console.log("***TEST*** " + prefix + test_desc);
            login({"nam": "demo", "pwd": "demo"});
            setTimeout(function() {
                ct.login(assert, "demo", "passerby");
                done();
            }, 1500);
            setTimeout(function () {
                ct.mainMenu(assert);
                // assert.ok(true, "Employee profile cache: " + QUnit.dump.parse(appCaches.profileCache));
                assert.ok(appCaches.profileCacheLength() > 0, "Employee profile cache populated");
                fullProfile = appCaches.getProfileByNick('demo');
                assert.ok("emp" in fullProfile, "Employee profile cache populated with an employee");
                assert.strictEqual(
                    fullProfile.emp.nick,
                    "demo",
                    "Employee profile cache populated with employee \"demo\""
                );
                assert.ok(true, 'select 1 ("Profile") in mainMenu as demo');
                $('input[name="sel"]').val('1');
                $('input[name="sel"]').focus();
                $('input[name="sel"]').trigger($.Event("keydown", {keyCode: 13}));
                // no AJAX call is initiated, because the profile is already in the cache
                // ct.ajaxCallInitiated(assert);
                done();
            }, 2000);
            setTimeout(function() {
                // assert.ok(true, $("#mainarea").html());
                ct.mainareaForm(assert, 'empProfile');
                // FIXME: test for non-existence of entries here, since we are
                // just a "passerby"
                loggout();
                done();
            }, 2500);
            setTimeout(function () {
                ct.loggout(assert);
                done();
            }, 3000);
        });

        test_desc = 'Search Dochazka employees - success no wildcard';
        // searches for an exact match - the resulting dbrowser will
        // contain only one object
        QUnit.test(test_desc, function (assert) {
            console.log('***TEST*** ' + prefix + test_desc);
            var done = assert.async(5);
            login({"nam": "root", "pwd": "immutable"});
            setTimeout(function () {
                ct.login(assert, "root", "admin");
                done();
            }, 1500);
            setTimeout(function () {
                var sel;
                ct.mainMenu(assert);
                ct.mainMenuToMainAdmin(assert);
                ct.mainAdminToSearchEmployee(assert);
                // enter search term into form
                $('#searchEmployee input[name="entry0"]').val('inactive');
                sel = ct.getMenuEntry(assert, $('#minimenu').html(), 'Search');
                $('input[name="sel"]').val(sel);
                $('input[name="sel"]').focus();
                start.mmKeyListener($.Event("keydown", {keyCode: 13}));
                ct.log(assert, "*** REACHED initiated search for Dochazka employee inactive");
                done();
            }, 2000);
            setTimeout(function () {
                var htmlbuf = $("#mainarea").html();
                ct.log(assert, htmlbuf);
                ct.stack(
                    assert,
                    4,
                    'Reached simpleEmployeeBrowser dbrowser',
                    'dbrowser',
                    'simpleEmployeeBrowser'
                );
                ct.contains(

share/js/dochazka-www/tests/main-empl.js  view on Meta::CPAN

                    ". LDAP sync",
                );
                assert.ok(true, "*** REACHED miniMenu contains substring '. LDAP sync'");
                // // choose '0' for ldapSync
                // $('input[name="sel"]').val('0');
                // $('input[name="sel"]').focus();
                // start.mmKeyListener($.Event("keydown", {keyCode: 13}));
                // assert.ok(true, "*** REACHED pressed 0 for LDAP sync");
                done();
            }, 3000);
            setTimeout(function () {
                // ct.contains(
                //     assert,
                //     $('#result').html(),
                //     "#result html",
                //     "Employee profile updated from LDAP",
                // );
                ct.stack(
                    assert,
                    4,
                    'in simpleEmployeeBrowser dbrowser',

share/js/dochazka-www/tests/main-empl.js  view on Meta::CPAN

                    assert,
                    2,
                    'After selecting X in ldapLookup',
                    'dmenu',
                    'mainAdmin'
                );
                assert.ok(true, "*** REACHED mainEmpl dmenu via X from ldapLookup");
                loggout();
                done();
            }, 5000);
            setTimeout(function () {
                ct.loggout(assert);
                done();
            }, 5500);
        });

        test_desc = 'Masquerading as active, set inactive as supervisor';
        QUnit.test(test_desc, function (assert) {
            console.log('***TEST*** ' + prefix + test_desc);
            var done = assert.async(10);
            login({"nam": "root", "pwd": "immutable"});
            setTimeout(function () {
                ct.login(assert, "root", "admin");
                done();
            }, 1500);
            setTimeout(function () {
                var mainarea,
                    sel;
                ct.mainMenu(assert);
                assert.strictEqual($('#userbox').text(), 'Employee: root ADMIN');
                ct.mainareaForm(assert, 'mainMenu');
                sel = ct.getMenuEntry(assert, $('#mainarea').html(), 'Masquerade');
                $('input[name="sel"]').val(sel);
                $('input[name="sel"]').focus();
                // press ENTER -> submit the form
                $('input[name="sel"]').trigger($.Event("keydown", {keyCode: 13}));
                ct.stack(assert, 2, 'navigating from mainMenu to searchEmployee', 'dform', 'searchEmployee');
                mainarea = $('#mainarea').html();
                ct.contains(assert, mainarea, "#mainarea", "Search Dochazka employees");
                assert.ok(true, "*** REACHED searchEmployee dform");
                done();
            }, 2000);
            setTimeout(function () {
                var minimenu,
                    sel;
                // enter a search string
                $('input[id="sEnick"]').val('act%');
                assert.strictEqual($('input[id="sEnick"]').val(), 'act%', "Search string entered into form");
                minimenu = $('#minimenu').html();
                ct.contains(assert, minimenu, "searchEmployee miniMenu", ". Search");
                sel = ct.getMenuEntry(assert, minimenu, 'Search')
                ct.log(assert, "searchEmployee miniMenu contains Search as selection " + sel);
                $('input[name="sel"]').val(sel);
                $('input[name="sel"]').focus();
                $('input[name="sel"]').trigger($.Event("keydown", {keyCode: 13}));
                done();
            }, 2500);
            setTimeout(function () {
                var mainarea,
                    minimenu,
                    sel;
                ct.stack(assert, 3, 'browsing results of successful Dochazka employee search',
                         'dbrowser', 'masqueradeCandidatesBrowser');
                assert.ok(true, "*** REACHED masqueradeCandidatesBrowser dform");
                mainarea = $('#mainarea').html();
                minimenu = $('#minimenu').html();
                ct.contains(assert, mainarea, "Masquerade candidates browser", 'Masquerade candidates');
                ct.contains(assert, minimenu, "Masquerade selection in miniMenu", ". Masquerade");

share/js/dochazka-www/tests/main-empl.js  view on Meta::CPAN

                // select Masquerade (first time - begin)
                $('input[name="sel"]').val(sel);
                $('input[name="sel"]').focus();
                // press ENTER -> submit the form
                $('input[name="sel"]').trigger($.Event("keydown", {keyCode: 13}));
                ct.stack(assert, 1, 'selected Masquerade in masqueradeCandidatesBrowser', 'dmenu', 'mainMenu');
                assert.strictEqual($('#userbox').text(), '!!! Employee: active (MASQUERADE) !!!');
                assert.ok(true, "*** REACHED masquerading as employee \"active\"");
                done();
            }, 3000);
            setTimeout(function () {
                ct.mainMenuSelectEmpProfile(assert);
                done();
            }, 3500);
            setTimeout(function () {
                var htmlbuf,
                    sel;
                // mainMenu, myProfileAction, empProfile
                ct.stack(assert, 3, 'navigating from mainMenu to empProfile', 'dform', 'empProfile');
                ct.mainareaForm(assert, 'empProfile');
                ct.contains(assert, $('#mainarea').html(), "#mainarea", "Employee profile");
                ct.log(assert, "*** REACHED empProfile dform");
                // Whatever the supervisor is, delete it
                sel = ct.getMenuEntry(assert, $('#minimenu').html(), "Remove supervisor");
                assert.ok(true, "Selection is " + sel);

share/js/dochazka-www/tests/main-empl.js  view on Meta::CPAN

                );
                ct.mainareaForm(assert, "empProfileSetSuperConfirm");
                sel = ct.getMenuEntry(assert, $('#minimenu').html(), 'Yes, I really do');
                assert.ok(true, "Selection is " + sel);
                $('input[name="sel"]').val(sel);
                $('input[name="sel"]').focus();
                // press ENTER -> submit the form
                $('input[name="sel"]').trigger($.Event("keydown", {keyCode: 13}));
                done();
            }, 4000);
            setTimeout(function () {
                var sel;
                ct.stack(
                    assert,
                    3,
                    'back in empProfile after confirming deletion of supervisor',
                    'dform',
                    'empProfile'
                );
                ct.log(assert, $('#mainarea').html());
                ct.contains(

share/js/dochazka-www/tests/main-empl.js  view on Meta::CPAN

                ct.stack(assert, 4, 'selected Set supervisor in empProfile', 'dform', 'searchEmployee');
                // enter search term into form
                $('#searchEmployee input[name="entry0"]').val('inactive');
                sel = ct.getMenuEntry(assert, $('#minimenu').html(), 'Search');
                $('input[name="sel"]').val(sel);
                $('input[name="sel"]').focus();
                start.mmKeyListener($.Event("keydown", {keyCode: 13}));
                assert.ok(true, "*** REACHED initiated search for Dochazka employee inactive");
                done();
            }, 4500);
            setTimeout(function () {
                var htmlbuf,
                    sel;
                ct.stack(
                    assert,
                    5,
                    'Reached simpleEmployeeBrowser dbrowser',
                    'dbrowser',
                    'setSupervisorBrowser'
                );
                htmlbuf = $("#mainarea").html(),

share/js/dochazka-www/tests/main-empl.js  view on Meta::CPAN

                );
                ct.mainareaForm(assert, "empProfileSetSuperConfirm");
                sel = ct.getMenuEntry(assert, $('#minimenu').html(), 'Yes, I really do');
                assert.ok(true, "Selection is " + sel);
                $('input[name="sel"]').val(sel);
                $('input[name="sel"]').focus();
                // press ENTER -> submit the form
                $('input[name="sel"]').trigger($.Event("keydown", {keyCode: 13}));
                done();
            }, 5000);
            setTimeout(function () {
                var sel;
                ct.stack(
                    assert,
                    3,
                    'back in empProfile after confirming selection of supervisor',
                    'dform',
                    'empProfile'
                );
                ct.log(assert, $('#mainarea').html());
                ct.contains(

share/js/dochazka-www/tests/main-empl.js  view on Meta::CPAN

                // turn off masquerade
                sel = ct.getMenuEntry(assert, $('#mainarea').html(), 'Masquerade');
                $('input[name="sel"]').val(sel);
                $('input[name="sel"]').focus();
                // press ENTER -> submit the form
                $('input[name="sel"]').trigger($.Event("keydown", {keyCode: 13}));
                assert.strictEqual($('#userbox').text(), 'Employee: root ADMIN');
                loggout();
                done();
            }, 5500);
            setTimeout(function () {
                ct.loggout(assert);
                done();
            }, 6000);
        });

    };
});

share/js/dochazka-www/tests/main-menu.js  view on Meta::CPAN

    return function () {

        test_desc = 'login, and immediately logout';
        QUnit.test(test_desc, function (assert) {
            console.log('***TEST*** ' + prefix + test_desc);
            var done = assert.async(3),
                mainarea,
                htmlbuf,
                cu;
            login({"nam": "root", "pwd": "immutable"});
            setTimeout(function () {
                ct.login(assert, "root", "admin");
                done();
            }, 1000);
            setTimeout(function () {
                ct.mainMenu(assert);
                loggout();
                done();
            }, 1500);
            setTimeout(function () {
                ct.loggout(assert);
                done();
            }, 2000);
        });

        test_desc = 'masquerade as employee "active"';
        QUnit.test(test_desc, function (assert) {
            console.log('***TEST*** ' + prefix + test_desc);
            var done = assert.async(5),
                mainarea,
                match,
                minimenu,
                htmlbuf,
                sel,
                cu;
            assert.expect(66);
            login({"nam": "root", "pwd": "immutable"});
            setTimeout(function () {
                ct.login(assert, "root", "admin");
                done();
            }, 1000);
            setTimeout(function () {
                ct.mainMenu(assert);
                assert.strictEqual($('#userbox').text(), 'Employee: root ADMIN');
                ct.mainareaForm(assert, 'mainMenu');
                sel = ct.getMenuEntry(assert, $('#mainarea').html(), 'Masquerade');
                if (! coreLib.isInteger(sel)) {
                    console.log("BAILING OUT");
                    assert.ok(false, "BAILING OUT");
                    done();
                }
                console.log("Main menu contains Masquerade as selection " + sel);

share/js/dochazka-www/tests/main-menu.js  view on Meta::CPAN

                $('input[name="sel"]').val(sel);
                $('input[name="sel"]').focus();
                // press ENTER -> submit the form
                $('input[name="sel"]').trigger($.Event("keydown", {keyCode: 13}));
                ct.stack(assert, 2, 'navigating from mainMenu to searchEmployee', 'dform', 'searchEmployee');
                mainarea = $('#mainarea').html();
                ct.contains(assert, mainarea, "#mainarea", "Search Dochazka employees");
                assert.ok(true, "*** REACHED searchEmployee dform");
                done();
            }, 2000);
            setTimeout(function () {
                // enter a search string
                $('input[id="sEnick"]').val('act%');
                assert.strictEqual($('input[id="sEnick"]').val(), 'act%', "Search string entered into form");
                minimenu = $('#minimenu').html();
                ct.contains(assert, minimenu, "searchEmployee miniMenu", ". Search");
                sel = ct.getMenuEntry(assert, minimenu, 'Search')
                ct.log(assert, "searchEmployee miniMenu contains Search as selection " + sel);
                $('input[name="sel"]').val(sel);
                $('input[name="sel"]').focus();
                $('input[name="sel"]').trigger($.Event("keydown", {keyCode: 13}));
            }, 2500);
            setTimeout(function () {
                ct.stack(assert, 3, 'browsing results of successful Dochazka employee search',
                         'dbrowser', 'masqueradeCandidatesBrowser');
                assert.ok(true, "*** REACHED masqueradeCandidatesBrowser dform");
                mainarea = $('#mainarea').html();
                minimenu = $('#minimenu').html();
                ct.contains(assert, mainarea, "Masquerade candidates browser", 'Masquerade candidates');
                ct.contains(assert, minimenu, "Masquerade selection in miniMenu", ". Masquerade");
                assert.ok(true, "*** REACHED Masquerade selection in masqueradeCandidatesBrowser miniMenu");
                sel = ct.getMenuEntry(assert, minimenu, 'Masquerade');
                assert.ok(true, "masqueradeCandidatesBrowser miniMenu contains Masquerade as selection " + sel);
                // select Masquerade (first time - begin)
                $('input[name="sel"]').val(sel);
                $('input[name="sel"]').focus();
                // press ENTER -> submit the form
                $('input[name="sel"]').trigger($.Event("keydown", {keyCode: 13}));
                ct.stack(assert, 1, 'selected Masquerade in masqueradeCandidatesBrowser', 'dmenu', 'mainMenu');
                assert.strictEqual($('#userbox').text(), '!!! Employee: active (MASQUERADE) !!!');
                assert.ok(true, "*** REACHED masquerading as employee \"active\"");
                done();
            }, 3000);
            setTimeout(function () {
                ct.mainareaForm(assert, 'mainMenu');
                htmlbuf = $('#mainarea').html();
                sel = ct.getMenuEntry(assert, htmlbuf, 'Masquerade');
                assert.ok(true, "Main menu contains Masquerade as selection " + sel);
                // select Masqerade (second time - end)
                $('input[name="sel"]').val(sel);
                $('input[name="sel"]').focus();
                // press ENTER -> submit the form
                $('input[name="sel"]').trigger($.Event("keydown", {keyCode: 13}));
                assert.strictEqual($('#userbox').text(), 'Employee: root ADMIN');
                loggout();
                done();
            }, 3500);
            setTimeout(function () {
                ct.loggout(assert);
                done();
            }, 4000);
        });

    };

});

share/js/dochazka-www/tests/main-sched.js  view on Meta::CPAN

    var prefix = "dochazka-www: ",
        test_desc;

    return function () {

        test_desc = 'schedule menu appears';
        QUnit.test(test_desc, function (assert) {
            console.log('***TEST*** ' + prefix + test_desc);
            var done = assert.async(3);
            login({"nam": "root", "pwd": "immutable"});
            setTimeout(function () {
                ct.login(assert, "root", "admin");
                done();
            }, 1000);
            setTimeout(function () {
                ct.mainMenu(assert);
                ct.mainMenuToMainSched(assert);
                loggout();
                done();
            }, 1500);
            setTimeout(function () {
                ct.loggout(assert);
                done();
            }, 2200);
        });

        test_desc = 'schedule lookup - bogus ID';
        QUnit.test(test_desc, function (assert) {
            console.log('***TEST*** ' + prefix + test_desc);
            var done = assert.async(4);
            login({"nam": "root", "pwd": "immutable"});
            setTimeout(function () {
                ct.login(assert, "root", "admin");
                done();
            }, 1000);
            setTimeout(function () {
                var entry1;
                ct.mainMenu(assert);
                ct.mainMenuToMainSched(assert);
                ct.mainSchedToSchedLookup(assert);
                entry1 = $('form#schedLookup input[name="entry1"]');
                entry1.val('BOGOSITYWHELP');
                assert.strictEqual(entry1.val(), 'BOGOSITYWHELP', "Form filled out with bogus data");
                $('input[name="sel"]').val('1');
                $('input[name="sel"]').focus();
                start.mmKeyListener($.Event("keydown", {keyCode: 13}));
                assert.ok(true, "*** REACHED schedLookup form submitted");
                ct.ajaxCallInitiated(assert);
                done();
            }, 1500);
            setTimeout(function () {
                var htmlbuf = $("#result").html();
                ct.stack(assert, 3, 'submitting bogus schedLookup form', 'dform', 'schedLookup');
                assert.ok(htmlbuf, "#result html: " + htmlbuf);
                ct.contains(assert, htmlbuf, "#result", 'URI does not match a known resource');
                $('input[name="sel"]').val('x');
                $('input[name="sel"]').focus();
                start.mmKeyListener($.Event("keydown", {keyCode: 13}));
                ct.stack(assert, 2, 'selecting "x" in schedLookup form', 'dmenu', 'mainSched');
                loggout();
                done();
            }, 2500);
            setTimeout(function () {
                ct.loggout(assert);
                done();
            }, 3000);
        });

    };
});



( run in 0.264 second using v1.01-cache-2.11-cpan-a5abf4f5562 )