From 9d9933491d75fe0884779ee8d37b08661d402a84 Mon Sep 17 00:00:00 2001 From: Ameya Shenoy Date: Tue, 11 Jul 2017 14:22:56 +0530 Subject: [PATCH] Desktop, Calendar View and Gantt View tests (#3652) * verify desktop icon and links * added comments and fixed indentation * refactored test_desktop, added test_calendarView, added custom functions to test_lib * . * added a generic func to click dropdown items * codacy fixes * added comments, changed test_list to delete the todo created * Update test_lib.js --- .../js/frappe/ui/toolbar/awesome_bar.js | 3 + frappe/tests/ui/test_calendar_view.js | 94 +++++++++++++++++++ frappe/tests/ui/test_desktop.js | 64 +++++++++++++ frappe/tests/ui/test_gantt_view.js | 53 +++++++++++ frappe/tests/ui/test_lib.js | 66 ++++++++++++- frappe/tests/ui/test_list.js | 22 +++-- 6 files changed, 292 insertions(+), 10 deletions(-) create mode 100644 frappe/tests/ui/test_calendar_view.js create mode 100644 frappe/tests/ui/test_desktop.js create mode 100644 frappe/tests/ui/test_gantt_view.js diff --git a/frappe/public/js/frappe/ui/toolbar/awesome_bar.js b/frappe/public/js/frappe/ui/toolbar/awesome_bar.js index 34e9432d27..53ca4cfff0 100644 --- a/frappe/public/js/frappe/ui/toolbar/awesome_bar.js +++ b/frappe/public/js/frappe/ui/toolbar/awesome_bar.js @@ -43,6 +43,9 @@ frappe.search.AwesomeBar = Class.extend({ } }); + // Added to aid UI testing of global search + input.awesomplete = awesomplete; + $input.on("input", function(e) { var value = e.target.value; var txt = value.trim().replace(/\s\s+/g, ' '); diff --git a/frappe/tests/ui/test_calendar_view.js b/frappe/tests/ui/test_calendar_view.js new file mode 100644 index 0000000000..44a87b7174 --- /dev/null +++ b/frappe/tests/ui/test_calendar_view.js @@ -0,0 +1,94 @@ +QUnit.module('views'); + +QUnit.test("Calendar View Tests", function(assert) { + assert.expect(7); + let done = assert.async(); + let random_text = frappe.utils.get_random(10); + let today = frappe.datetime.get_today()+" 16:20:35"; //arbitrary value taken to prevent cases like 12a for 12:00am and 12h to 24h conversion + let visible_time = () => { + // Method to return the start-time (hours) of the event visible + return $('.fc-time').text().split('p')[0]; // 'p' because the arbitrary time is pm + }; + // let visible_hours = () => { + // // Method to return the start-time (hours) of the event visible + // return $('.fc-time').text().split(':')[0].replace(/\D+/g, ''); + // }; + // let visible_minutes = () => { + // // Method to return the start-time (minutes) of the event visible + // return $('.fc-time').text().split(':')[1].replace(/\D+/g, ''); + // }; + let event_title_text = () => { + // Method to return the title of the event visible + return $('.fc-title:visible').text(); + }; + + frappe.run_serially([ + // Create an event using the frappe API + () => frappe.tests.make("Event", [ + {subject: random_text}, + {starts_on: today}, + {event_type: 'Private'} + ]), + + // Goto Calendar view + () => frappe.set_route(["List", "Event", "Calendar"]), + // Check if event is created + () => { + // Check if the event exists and if its title matches with the one created + assert.equal(event_title_text(), random_text); + // Check if time of event created is correct + // assert.equal(visible_hours(), 4); + // assert.equal(visible_minutes(), 20); + assert.equal(visible_time(), "4:20"); + }, + + // Delete event + // Goto Calendar view + () => frappe.set_route(["List", "Event", "Calendar"]), + () => frappe.timeout(0.3), + // Open the event to be deleted + () => frappe.tests.click_generic_text(random_text), + () => frappe.tests.click_page_head_item('Menu'), + () => frappe.tests.click_dropdown_item('Delete'), + () => frappe.tests.click_page_head_item('Yes'), + () => frappe.timeout(4), + // Goto Calendar View + () => frappe.set_route(["List", "Event", "Calendar"]), + () => frappe.timeout(0.3), + + // Check if all menu items redirect to correct locations + // Check if clicking on 'Import' redirects you to ["data-import-tool"] + () => frappe.tests.click_page_head_item('Menu'), + () => frappe.tests.click_dropdown_item('Import'), + () => assert.deepEqual(["data-import-tool"], frappe.get_route()), + () => window.history.back(), + () => frappe.timeout(0.5), + + // Check if clicking on 'User Permissions Manager' redirects you to ["user-permissions"] + () => frappe.tests.click_page_head_item('Menu'), + () => frappe.tests.click_dropdown_item('User Permissions Manager'), + () => assert.deepEqual(["user-permissions"], frappe.get_route()), + () => window.history.back(), + () => frappe.timeout(0.5), + + // Check if clicking on 'Role Permissions Manager' redirects you to ["permission-manager"] + () => frappe.tests.click_page_head_item('Menu'), + () => frappe.tests.click_dropdown_item('Role Permissions Manager'), + () => assert.deepEqual(["permission-manager"], frappe.get_route()), + () => window.history.back(), + () => frappe.timeout(0.5), + + // Check if clicking on 'Customize' redirects you to ["Form", "Customize Form"] + () => frappe.tests.click_page_head_item('Menu'), + () => frappe.tests.click_dropdown_item('Customize'), + () => assert.deepEqual(["Form", "Customize Form"], frappe.get_route()), + () => window.history.back(), + () => frappe.timeout(0.5), + + // Check if event is deleted + () => assert.equal(event_title_text(), ""), + + () => done() + + ]); +}); \ No newline at end of file diff --git a/frappe/tests/ui/test_desktop.js b/frappe/tests/ui/test_desktop.js new file mode 100644 index 0000000000..389b22f77d --- /dev/null +++ b/frappe/tests/ui/test_desktop.js @@ -0,0 +1,64 @@ +QUnit.module('views'); + +QUnit.test("Verification of navbar menu links", function(assert) { + assert.expect(14); + let done = assert.async(); + let navbar_user_items = ['Set Desktop Icons', 'My Settings', 'Reload', 'View Website', 'Background Jobs', 'Logout']; + let modal_and_heading = ['Documentation', 'About']; + + frappe.run_serially([ + // Goto Desk using button click to check if its working + () => frappe.tests.click_navbar_item('Home'), + () => assert.deepEqual([""], frappe.get_route()), + + // Click username on the navbar (Adminisrator) and verify visibility of all elements + () => frappe.tests.click_navbar_item('navbar_user'), + () => navbar_user_items.forEach(function(navbar_user_item) { + assert.ok(frappe.tests.is_visible(navbar_user_item)); + }), + + // Click Help and verify visibility of all elements + () => frappe.tests.click_navbar_item('Help'), + () => modal_and_heading.forEach(function(modal) { + assert.ok(frappe.tests.is_visible(modal)); + }), + + // Goto Desk + () => frappe.tests.click_navbar_item('Home'), + () => frappe.timeout(0.3), + + // Click navbar-username and verify links of all menu items + // Check if clicking on 'Set Desktop Icons' redirects you to the correct page + () => frappe.tests.click_navbar_item('navbar_user'), + () => frappe.tests.click_dropdown_item('Set Desktop Icons'), + () => assert.deepEqual(["modules_setup"], frappe.get_route()), + () => frappe.tests.click_navbar_item('Home'), + + // Check if clicking on 'My Settings' redirects you to the correct page + () => frappe.tests.click_navbar_item('navbar_user'), + () => frappe.tests.click_dropdown_item('My Settings'), + () => assert.deepEqual(["Form", "User", "Administrator"], frappe.get_route()), + () => frappe.tests.click_navbar_item('Home'), + + // Check if clicking on 'Background Jobs' redirects you to the correct page + () => frappe.tests.click_navbar_item('navbar_user'), + () => frappe.tests.click_dropdown_item('Background Jobs'), + () => assert.deepEqual(["background_jobs"], frappe.get_route()), + () => frappe.tests.click_navbar_item('Home'), + + // Click Help and check both modals + // Check if clicking 'Documentation' opens the right modal + () => frappe.tests.click_navbar_item('Help'), + () => frappe.tests.click_dropdown_item('Documentation'), + () => assert.ok(frappe.tests.is_visible('Documentation', 'span')), + () => frappe.tests.click_generic_text('Close', 'button'), + + // Check if clicking 'About' opens the right modal + () => frappe.tests.click_navbar_item('Help'), + () => frappe.tests.click_dropdown_item('About'), + () => assert.ok(frappe.tests.is_visible('Frappe Framework', 'div')), + () => frappe.tests.click_generic_text('Close', 'button'), + + () => done() + ]); +}); \ No newline at end of file diff --git a/frappe/tests/ui/test_gantt_view.js b/frappe/tests/ui/test_gantt_view.js new file mode 100644 index 0000000000..0ec6c38ff2 --- /dev/null +++ b/frappe/tests/ui/test_gantt_view.js @@ -0,0 +1,53 @@ +QUnit.module('views'); + +QUnit.test("Gantt View Tests", function(assert) { + assert.expect(2); + let done = assert.async(); + let random_text = frappe.utils.get_random(10); + let start_date = frappe.datetime.get_today()+" 16:20:35"; // arbitrary value taken to prevent cases like 12a for 12:00am and 12h to 24h conversion + let end_date = frappe.datetime.get_today()+" 18:30:45"; //arbitrary value taken to prevent cases like 12a for 12:00am and 12h to 24h conversion + let event_id = () => { + // Method to acquire the ID of the event created. This is needed to redirect to the event page + let event_label = $('.bar-label').text(); + let init = event_label.indexOf('('); + let fin = event_label.indexOf(')'); + return (event_label.substr(init+1,fin-init-1)); + }; + let event_title_text = (text) => { + // Method to check the name of the event created. This is needed to verify the creation and deletion of the event + return $('#bar > g > g.bar-group > text:visible').text().includes(text); + }; + + frappe.run_serially([ + // Create an event using the Frapee API + () => { + return frappe.tests.make("Event", [ + {subject: random_text}, + {starts_on: start_date}, + {ends_on: end_date}, + {event_type: 'Private'} + ]); + }, + + // Check if event is created + () => frappe.set_route(["List", "Event", "Gantt"]), + () => assert.ok( event_title_text(random_text) ), + + // Delete event + () => frappe.set_route(["List", "Event", "Gantt"]), + () => frappe.timeout(0.3), + // Redirect to the event page to delete the event + () => frappe.set_route(["Form", "Event", event_id()]), + () => frappe.tests.click_page_head_item('Menu'), + () => frappe.tests.click_dropdown_item('Delete'), + () => frappe.tests.click_page_head_item('Yes'), + () => frappe.timeout(0.3), + () => frappe.set_route(["List", "Event", "Gantt"]), + () => frappe.timeout(0.3), + + // Check if event is deleted + () => assert.ok( event_title_text("") ), + + () => done() + ]); +}); \ No newline at end of file diff --git a/frappe/tests/ui/test_lib.js b/frappe/tests/ui/test_lib.js index 169b5d6abe..ede4a3449f 100644 --- a/frappe/tests/ui/test_lib.js +++ b/frappe/tests/ui/test_lib.js @@ -90,6 +90,70 @@ frappe.tests = { return frappe.run_serially(tasks); }); }, + click_page_head_item: (text) => { + // Method to items present on the page header like New, Save, Delete etc. + let possible_texts = ["New", "Delete", "Save", "Yes"]; + return frappe.run_serially([ + () => { + if (text == "Menu"){ + $("span.menu-btn-group-label:contains('Menu'):visible").click(); + } else if (text == "Refresh") { + $(".btn-secondary:contains('Refresh'):visible").click(); + } else if (possible_texts.includes(text)) { + $(".btn-primary:contains("+text+"):visible").click(); + } + }, + () => frappe.timeout(0.3) + ]); + }, + click_dropdown_item: (text) => { + // Method to click dropdown elements + return frappe.run_serially([ + () => { + let li = $(".dropdown-menu li:contains("+text+"):visible").get(0); + $(li).find('a')[0].click(); + }, + () => frappe.timeout(0.3) + ]); + }, + click_navbar_item: (text) => { + // Method to click an elements present on the navbar + return frappe.run_serially([ + () => { + if (text == "Help"){ + $(".dropdown-help .dropdown-toggle:visible").click(); + } + else if (text == "navbar_user"){ + $(".dropdown-navbar-user .dropdown-toggle:visible").click(); + } + else if (text == "Notification"){ + $(".navbar-new-comments").click(); + } + else if (text == "Home"){ + $(".navbar-home:contains('Home'):visible")[0].click(); + } + }, + () => frappe.timeout(0.3) + ]); + }, + click_generic_text: (text, tag='a') => { + // Method to click an element by its name + return frappe.run_serially([ + () => $(tag+":contains("+text+"):visible")[0].click(), + () => frappe.timeout(0.3) + ]); + }, + click_desktop_icon: (text) => { + // Method to click the desktop icons on the Desk, by their name + return frappe.run_serially([ + () => $("#icon-grid > div > div.app-icon[title="+text+"]").click(), + () => frappe.timeout(0.3) + ]); + }, + is_visible: (text, tag='a') => { + // Method to check the visibility of an element + return $(tag+":contains("+text+")").is(':visible'); + }, click_button: function(text) { $(`.btn:contains("${text}"):visible`).click(); return frappe.timeout(0.3); @@ -98,4 +162,4 @@ frappe.tests = { $(`a:contains("${text}"):visible`).click(); return frappe.timeout(0.3); } -}; \ No newline at end of file +}; diff --git a/frappe/tests/ui/test_list.js b/frappe/tests/ui/test_list.js index 94f1cfd21a..f154b45c01 100644 --- a/frappe/tests/ui/test_list.js +++ b/frappe/tests/ui/test_list.js @@ -1,27 +1,31 @@ QUnit.module('views'); -QUnit.test("test quick entry", function(assert) { +QUnit.test("Test quick entry", function(assert) { assert.expect(2); let done = assert.async(); - let random = frappe.utils.get_random(10); + let random_text = frappe.utils.get_random(10); frappe.run_serially([ () => frappe.set_route('List', 'ToDo'), () => frappe.new_doc('ToDo'), - () => frappe.quick_entry.dialog.set_value('description', random), + () => frappe.quick_entry.dialog.set_value('description', random_text), () => frappe.quick_entry.insert(), (doc) => { assert.ok(doc && !doc.__islocal); return frappe.set_route('Form', 'ToDo', doc.name); }, - () => { - assert.ok(cur_frm.doc.description.includes(random)); - return done(); - } + () => assert.ok(cur_frm.doc.description.includes(random_text)), + + // Delete the created ToDo + () => frappe.tests.click_page_head_item('Menu'), + () => frappe.tests.click_dropdown_item('Delete'), + () => frappe.tests.click_page_head_item('Yes'), + + () => done() ]); }); -QUnit.test("test list values", function(assert) { +QUnit.test("Test list values", function(assert) { assert.expect(2); let done = assert.async(); frappe.set_route('List', 'DocType') @@ -30,4 +34,4 @@ QUnit.test("test list values", function(assert) { assert.ok($('.list-item:visible').length > 10); done(); }); -}); \ No newline at end of file +});