cypress_test/.eslintrc | 3 ++- cypress_test/eslint_plugin/index.js | 29 +++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-)
New commits: commit 8853547ee0c414a894ef97f949e8af64d583af18 Author: Tamás Zolnai <tamas.zol...@collabora.com> AuthorDate: Mon Jun 1 13:22:14 2020 +0200 Commit: Tamás Zolnai <tamas.zol...@collabora.com> CommitDate: Mon Jun 1 14:09:53 2020 +0200 cypress: add no-get-invoke-match-chain rule. We can avoid retriability problems caused by using this long chain as an indicator in tests. Change-Id: Iec78087d080c3759e446a061222eb4d9f4dd3ae5 Reviewed-on: https://gerrit.libreoffice.org/c/online/+/95280 Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com> Tested-by: Jenkins Reviewed-by: Tamás Zolnai <tamas.zol...@collabora.com> diff --git a/cypress_test/.eslintrc b/cypress_test/.eslintrc index 19001679f..2a4452399 100644 --- a/cypress_test/.eslintrc +++ b/cypress_test/.eslintrc @@ -2,7 +2,8 @@ "extends": "../loleaflet/.eslintrc", "plugins": ["cypress-rules"], "rules": { - "cypress-rules/no-get-contains-chain": 2 + "cypress-rules/no-get-contains-chain": 2, + "cypress-rules/no-get-invoke-match-chain": 2 }, "parserOptions": { "ecmaVersion": 6, diff --git a/cypress_test/eslint_plugin/index.js b/cypress_test/eslint_plugin/index.js index 4c2d71c16..d69d2ff60 100644 --- a/cypress_test/eslint_plugin/index.js +++ b/cypress_test/eslint_plugin/index.js @@ -26,6 +26,35 @@ module.exports = { } }; } + }, + 'no-get-invoke-match-chain': { + /** + * Catches cy.get(selector).invoke('text').should('match',...) calls in the code. + * + * Issue: In cypress test framework only the last getter command is retried. + * In this case it's the invoke method and so the get() method is + * not retried. Sometimes, it behaves unexpectedly, because the test + * retries to call the text method on an element, which might be removed + * in the meantime. Instead of searching for a new element matching both + * with the selector and the regular expression. + * + * Fix: We can use cy.contains(seletor, regexp) method instead. + * This is a compact command which will retry to match both the + * selector and the text matcher. + * + **/ + create: function(context) { + return { + 'CallExpression[callee.property.name=\'should\'][callee.object.callee.property.name=\'invoke\'][callee.object.callee.object.callee.property.name=\'get\']': function(expr) { + if (expr.arguments && expr.arguments.length === 2 && expr.arguments[0].value === 'match' && + expr.callee.object.arguments && + expr.callee.object.arguments.length === 1 && + expr.callee.object.arguments[0].value === 'text') { + context.report(expr, 'Do not use this long chain for matching text. Use cy.contains(selector, regexp) instead for better retriability!'); + } + } + }; + } } } }; _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits