diff --git a/.travis.yml b/.travis.yml index e163f64b68..0dbd382702 100644 --- a/.travis.yml +++ b/.travis.yml @@ -25,7 +25,7 @@ matrix: exclude: - python: 2.7 env: DB=postgres - - python: 3.6 + - python: 2.7 env: TEST_TYPE=ui install: diff --git a/.travis/install.sh b/.travis/install.sh index 671b059001..a457939b22 100755 --- a/.travis/install.sh +++ b/.travis/install.sh @@ -18,6 +18,10 @@ sudo pip install -e ~/bench rm $TRAVIS_BUILD_DIR/.git/shallow cd ~/ && bench init frappe-bench --python $(which python) --frappe-path $TRAVIS_BUILD_DIR -cp -r $TRAVIS_BUILD_DIR/test_sites/test_site ~/frappe-bench/sites/ -cp -r $TRAVIS_BUILD_DIR/test_sites/test_site_postgres ~/frappe-bench/sites/ -cp -r $TRAVIS_BUILD_DIR/test_sites/test_site_ui ~/frappe-bench/sites/ \ No newline at end of file +if [[ $DB == 'mariadb' ]]; then + cp -r $TRAVIS_BUILD_DIR/test_sites/test_site ~/frappe-bench/sites/ +elif [[ $TEST_TYPE == 'ui' ]]; then + cp -r $TRAVIS_BUILD_DIR/test_sites/test_site_ui ~/frappe-bench/sites/ +elif [[ $DB == 'postgres' ]]; then + cp -r $TRAVIS_BUILD_DIR/test_sites/test_site_postgres ~/frappe-bench/sites/ +fi diff --git a/.travis/run-tests.sh b/.travis/run-tests.sh index a333e050bb..177e191088 100755 --- a/.travis/run-tests.sh +++ b/.travis/run-tests.sh @@ -16,8 +16,8 @@ if [[ $DB == 'mariadb' ]]; then elif [[ $TEST_TYPE == 'ui' ]]; then setup_mariadb_env 'test_site_ui' - bench --site test_site_ui --force restore ./apps/frappe/test_sites/test_site_ui/test_site_ui-database.sql.gz - bench --site test_site_ui migrate + bench --site test_site_ui reinstall --yes + bench --site test_site_ui execute frappe.utils.install.complete_setup_wizard bench --site test_site_ui scheduler disable cd apps/frappe && yarn && yarn cypress:run diff --git a/cypress/integration/awesome_bar.js b/cypress/integration/awesome_bar.js index 4b2ae0da93..5504484cc0 100644 --- a/cypress/integration/awesome_bar.js +++ b/cypress/integration/awesome_bar.js @@ -1,5 +1,6 @@ context('Awesome Bar', () => { before(() => { + cy.visit('/login'); cy.login('Administrator', 'qwe'); cy.visit('/desk'); }); diff --git a/cypress/integration/table_multiselect.js b/cypress/integration/table_multiselect.js index a083e514ba..e53584640b 100644 --- a/cypress/integration/table_multiselect.js +++ b/cypress/integration/table_multiselect.js @@ -3,47 +3,49 @@ context('Table MultiSelect', () => { cy.login('Administrator', 'qwe'); }); - let todo_description = 'table multiselect' + Math.random().toString().slice(2, 8); + let name = 'table multiselect' + Math.random().toString().slice(2, 8); it('select value from multiselect dropdown', () => { - cy.visit('/desk#Form/ToDo/New ToDo 1'); - cy.fill_field('description', todo_description, 'Text Editor').blur(); - cy.get('input[data-fieldname="assign_to"]').focus().as('input'); - cy.get('input[data-fieldname="assign_to"] + ul').should('be.visible'); - cy.get('@input').type('faris{enter}', { delay: 100 }); - cy.get('.frappe-control[data-fieldname="assign_to"] .form-control .tb-selected-value') + cy.new_form('Assignment Rule'); + cy.fill_field('__newname', name); + cy.fill_field('document_type', 'ToDo'); + cy.fill_field('assign_condition', 'status=="Open"'); + cy.get('input[data-fieldname="users"]').focus().as('input'); + cy.get('input[data-fieldname="users"] + ul').should('be.visible'); + cy.get('@input').type('test{enter}', { delay: 100 }); + cy.get('.frappe-control[data-fieldname="users"] .form-control .tb-selected-value') .first().as('selected-value'); - cy.get('@selected-value').should('contain', 'faris@erpnext.com'); + cy.get('@selected-value').should('contain', 'test@erpnext.com'); cy.server(); cy.route('POST', '/api/method/frappe.desk.form.save.savedocs').as('save_form'); // trigger save cy.get('.primary-action').click(); cy.wait('@save_form').its('status').should('eq', 200); - cy.get('@selected-value').should('contain', 'faris@erpnext.com'); + cy.get('@selected-value').should('contain', 'test@erpnext.com'); }); it('delete value using backspace', () => { - cy.visit('/desk#List/ToDo/List'); + cy.go_to_list('Assignment Rule'); cy.get(`.list-subject:contains("table multiselect")`).last().find('a').click(); - cy.get('input[data-fieldname="assign_to"]').focus().type('{backspace}'); - cy.get('.frappe-control[data-fieldname="assign_to"] .form-control .tb-selected-value') + cy.get('input[data-fieldname="users"]').focus().type('{backspace}'); + cy.get('.frappe-control[data-fieldname="users"] .form-control .tb-selected-value') .should('not.exist'); }); it('delete value using x', () => { - cy.visit('/desk#List/ToDo/List'); + cy.go_to_list('Assignment Rule'); cy.get(`.list-subject:contains("table multiselect")`).last().find('a').click(); - cy.get('.frappe-control[data-fieldname="assign_to"] .form-control .tb-selected-value').as('existing_value'); + cy.get('.frappe-control[data-fieldname="users"] .form-control .tb-selected-value').as('existing_value'); cy.get('@existing_value').find('.btn-remove').click(); cy.get('@existing_value').should('not.exist'); }); it('navigate to selected value', () => { - cy.visit('/desk#List/ToDo/List'); + cy.go_to_list('Assignment Rule'); cy.get(`.list-subject:contains("table multiselect")`).last().find('a').click(); - cy.get('.frappe-control[data-fieldname="assign_to"] .form-control .tb-selected-value').as('existing_value'); + cy.get('.frappe-control[data-fieldname="users"] .form-control .tb-selected-value').as('existing_value'); cy.get('@existing_value').find('.btn-link-to-form').click(); - cy.location('hash').should('contain', 'Form/User/faris@erpnext.com'); + cy.location('hash').should('contain', 'Form/User/test@erpnext.com'); }); }); diff --git a/cypress/support/commands.js b/cypress/support/commands.js index 36df14d1b0..3fd3028604 100644 --- a/cypress/support/commands.js +++ b/cypress/support/commands.js @@ -25,10 +25,9 @@ // Cypress.Commands.overwrite("visit", (originalFn, url, options) => { ... }); Cypress.Commands.add('login', (email, password) => { cy.request({ - url: '/', + url: '/api/method/login', method: 'POST', body: { - cmd: 'login', usr: email, pwd: password } @@ -54,3 +53,11 @@ Cypress.Commands.add('fill_field', (fieldname, value, fieldtype='Data') => { Cypress.Commands.add('awesomebar', (text) => { cy.get('#navbar-search').type(`${text}{downarrow}{enter}`, { delay: 100 }); }); + +Cypress.Commands.add('new_form', (doctype) => { + cy.visit(`/desk#Form/${doctype}/New ${doctype} 1`); +}); + +Cypress.Commands.add('go_to_list', (doctype) => { + cy.visit(`/desk#List/${doctype}/List`); +}); diff --git a/frappe/automation/doctype/assignment_rule/assignment_rule.json b/frappe/automation/doctype/assignment_rule/assignment_rule.json index f64a965028..1996281acf 100644 --- a/frappe/automation/doctype/assignment_rule/assignment_rule.json +++ b/frappe/automation/doctype/assignment_rule/assignment_rule.json @@ -380,7 +380,7 @@ "collapsible": 0, "columns": 0, "fieldname": "users", - "fieldtype": "Table", + "fieldtype": "Table MultiSelect", "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, @@ -449,7 +449,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2019-02-28 17:12:44.413782", + "modified": "2019-03-08 15:13:01.379471", "modified_by": "Administrator", "module": "Automation", "name": "Assignment Rule", @@ -476,7 +476,7 @@ "write": 1 } ], - "quick_entry": 1, + "quick_entry": 0, "read_only": 0, "read_only_onload": 0, "show_name_in_global_search": 0, diff --git a/frappe/email/doctype/notification/test_notification.py b/frappe/email/doctype/notification/test_notification.py index 76a4fb29b7..4d3c3167a5 100644 --- a/frappe/email/doctype/notification/test_notification.py +++ b/frappe/email/doctype/notification/test_notification.py @@ -108,6 +108,7 @@ class TestNotification(unittest.TestCase): { "email_by_document_field": "owner" } ] }).insert() + frappe.db.commit() event = frappe.new_doc("Event") event.subject = "test-2", diff --git a/frappe/recorder.py b/frappe/recorder.py index bb6bc8bb45..2a278074cf 100644 --- a/frappe/recorder.py +++ b/frappe/recorder.py @@ -12,6 +12,7 @@ import traceback import frappe import sqlparse +from frappe import _ RECORDER_INTERCEPT_FLAG = "recorder-intercept" RECORDER_REQUEST_SPARSE_HASH = "recorder-requests-sparse" diff --git a/frappe/tests/test_website.py b/frappe/tests/test_website.py index 583bed6409..c47ebd01f0 100644 --- a/frappe/tests/test_website.py +++ b/frappe/tests/test_website.py @@ -10,6 +10,12 @@ def set_request(**kwargs): builder = EnvironBuilder(**kwargs) frappe.local.request = Request(builder.get_environ()) +def get_html_for_route(route): + set_request(method='GET', path=route) + response = render.render() + html = frappe.safe_decode(response.get_data()) + return html + class TestWebsite(unittest.TestCase): def test_page_load(self): diff --git a/frappe/utils/install.py b/frappe/utils/install.py index a7256509d2..809ec36e53 100644 --- a/frappe/utils/install.py +++ b/frappe/utils/install.py @@ -104,21 +104,24 @@ def before_tests(): frappe.clear_cache() # complete setup if missing - from frappe.desk.page.setup_wizard.setup_wizard import setup_complete if not int(frappe.db.get_single_value('System Settings', 'setup_complete') or 0): - setup_complete({ - "language" :"English", - "email" :"test@erpnext.com", - "full_name" :"Test User", - "password" :"test", - "country" :"United States", - "timezone" :"America/New_York", - "currency" :"USD" - }) + complete_setup_wizard() frappe.db.commit() frappe.clear_cache() +def complete_setup_wizard(): + from frappe.desk.page.setup_wizard.setup_wizard import setup_complete + setup_complete({ + "language" :"English", + "email" :"test@erpnext.com", + "full_name" :"Test User", + "password" :"test", + "country" :"United States", + "timezone" :"America/New_York", + "currency" :"USD" + }) + def import_country_and_currency(): from frappe.geo.country_info import get_all from frappe.utils import update_progress_bar diff --git a/test_sites/test_site_ui/test_site_ui-database.sql.gz b/test_sites/test_site_ui/test_site_ui-database.sql.gz deleted file mode 100644 index 560de3dfa0..0000000000 Binary files a/test_sites/test_site_ui/test_site_ui-database.sql.gz and /dev/null differ