From 1e8abae47c4acbbfcebd138074f73bf1f5b111ec Mon Sep 17 00:00:00 2001 From: Stas Vilchik Date: Mon, 6 Jul 2015 16:54:34 +0200 Subject: [PATCH] transition coding rules web tests --- server/sonar-web/test/helpers/test-page.js | 19 + server/sonar-web/test/intern.js | 3 +- .../test/medium/coding-rules.spec.js | 848 ++++++++++++++++++ 3 files changed, 869 insertions(+), 1 deletion(-) create mode 100644 server/sonar-web/test/medium/coding-rules.spec.js diff --git a/server/sonar-web/test/helpers/test-page.js b/server/sonar-web/test/helpers/test-page.js index e38ad102907..c977852dbfc 100644 --- a/server/sonar-web/test/helpers/test-page.js +++ b/server/sonar-web/test/helpers/test-page.js @@ -109,6 +109,15 @@ define(function (require) { }); }; + Command.prototype.submitForm = function (selector) { + return new this.constructor(this, function () { + return this.parent + .execute(function (selector) { + jQuery(selector).submit(); + }, [selector]); + }); + }; + Command.prototype.mockFromFile = function (url, file, options) { var response = fs.readFileSync('src/test/json/' + file, 'utf-8'); return new this.constructor(this, function () { @@ -157,8 +166,18 @@ define(function (require) { return new this.constructor(this, function () { return this.parent .get(require.toUrl(url)) + .mockFromString('/api/l10n/index', '{}') .checkElementExist('#content'); }); }; + Command.prototype.forceJSON = function () { + return new this.constructor(this, function () { + return this.parent + .execute(function () { + jQuery.ajaxSetup({ dataType: 'json' }); + }); + }); + }; + }); diff --git a/server/sonar-web/test/intern.js b/server/sonar-web/test/intern.js index 3463d7b1ee8..2756d263a9b 100644 --- a/server/sonar-web/test/intern.js +++ b/server/sonar-web/test/intern.js @@ -22,7 +22,8 @@ define(['intern'], function (intern) { functionalSuites: [ 'test/medium/users.spec', 'test/medium/issues.spec', - 'test/medium/update-center.spec' + 'test/medium/update-center.spec', + 'test/medium/coding-rules.spec' ], tunnel: tunnel, diff --git a/server/sonar-web/test/medium/coding-rules.spec.js b/server/sonar-web/test/medium/coding-rules.spec.js new file mode 100644 index 00000000000..7fd064c3a11 --- /dev/null +++ b/server/sonar-web/test/medium/coding-rules.spec.js @@ -0,0 +1,848 @@ +define(function (require) { + var bdd = require('intern!bdd'); + require('../helpers/test-page'); + + bdd.describe('Coding Rules Page', function () { + + bdd.it('should show alert when there is no available profiles for activation', function () { + return this.remote + .open() + .mockFromFile('/api/rules/app', 'coding-rules-spec/app-no-available-profiles.json') + .mockFromFile('/api/rules/search', 'coding-rules-spec/search-no-available-profiles.json') + .mockFromFile('/api/rules/show', 'coding-rules-spec/show-no-available-profiles.json') + .mockFromString('/api/issues/search', '{}') + .startApp('coding-rules') + .checkElementExist('.coding-rule.selected') + .clickElement('.coding-rule.selected .js-rule') + .checkElementExist('.coding-rules-detail-header') + .checkElementExist('#coding-rules-quality-profile-activate') + .clickElement('#coding-rules-quality-profile-activate') + .checkElementExist('.modal') + .checkElementExist('.modal .alert'); + }); + + bdd.it('should show profile facet', function () { + return this.remote + .open() + .mockFromFile('/api/rules/app', 'coding-rules-spec/app.json') + .mockFromFile('/api/rules/search', + 'coding-rules-spec/search-profile-facet-qprofile-active.json', + { data: { activation: true } }) + .mockFromFile('/api/rules/search', + 'coding-rules-spec/search-profile-facet-qprofile-inactive.json', + { data: { activation: 'false' } }) + .mockFromFile('/api/rules/search', 'coding-rules-spec/search-profile-facet.json') + .startApp('coding-rules') + .checkElementExist('.coding-rule') + .checkElementInclude('#coding-rules-total', '609') + .clickElement('[data-property="qprofile"] .js-facet-toggle') + .checkElementExist('.js-facet[data-value="java-default-with-mojo-conventions-49307"]') + .clickElement('.js-facet[data-value="java-default-with-mojo-conventions-49307"]') + .checkElementInclude('#coding-rules-total', '407') + .checkElementExist('.js-facet[data-value="java-default-with-mojo-conventions-49307"] .js-active.facet-toggle-active') + .clickElement('.js-facet[data-value="java-default-with-mojo-conventions-49307"] .js-inactive') + .checkElementInclude('#coding-rules-total', '408') + .checkElementExist('.js-facet[data-value="java-default-with-mojo-conventions-49307"] .js-inactive.facet-toggle-active') + .clickElement('[data-property="qprofile"] .js-facet-toggle') + .checkElementInclude('#coding-rules-total', '609'); + }); + + bdd.it('should show query facet', function () { + return this.remote + .open() + .mockFromFile('/api/rules/app', 'coding-rules-spec/app.json') + .mockFromFile('/api/rules/search', 'coding-rules-spec/search-query.json', { data: { q: 'query' } }) + .mockFromFile('/api/rules/search', 'coding-rules-spec/search.json') + .startApp('coding-rules') + .checkElementExist('.coding-rule') + .checkElementInclude('#coding-rules-total', '609') + .fillElement('[data-property="q"] input', 'query') + .submitForm('[data-property="q"] form') + .checkElementInclude('#coding-rules-total', '4') + .fillElement('[data-property="q"] input', '') + .submitForm('[data-property="q"] form') + .checkElementInclude('#coding-rules-total', '609'); + }); + + bdd.it('should show rule permalink', function () { + return this.remote + .open() + .mockFromFile('/api/rules/app', 'coding-rules-spec/app.json') + .mockFromFile('/api/rules/search', 'coding-rules-spec/search.json') + .mockFromFile('/api/rules/show', 'coding-rules-spec/show.json') + .mockFromString('/api/issues/search', '{}') + .startApp('coding-rules') + .checkElementExist('.coding-rule.selected') + .clickElement('.coding-rule.selected .js-rule') + .checkElementExist('.coding-rules-detail-header') + .checkElementExist('a[href="/coding_rules#rule_key=squid%3AS2204"]'); + }); + + bdd.it('should activate profile', function () { + return this.remote + .open() + .mockFromFile('/api/rules/app', 'coding-rules-spec/app.json') + .mockFromFile('/api/rules/search', 'coding-rules-spec/search.json') + .mockFromFile('/api/rules/show', 'coding-rules-spec/show-activate-profile.json') + .mockFromString('/api/qualityprofiles/activate_rule', '{}') + .mockFromString('/api/issues/search', '{}') + .startApp('coding-rules') + .checkElementExist('.coding-rule.selected') + .clickElement('.coding-rule.selected .js-rule') + .checkElementExist('.coding-rules-detail-header') + .checkElementNotExist('.coding-rules-detail-quality-profile-name') + .checkElementExist('#coding-rules-quality-profile-activate') + .clickElement('#coding-rules-quality-profile-activate') + .checkElementExist('.modal') + .clearMocks() + .mockFromFile('/api/rules/show', 'coding-rules-spec/show-activate-profile-with-profile.json') + .mockFromString('/api/qualityprofiles/activate_rule', '{}') + .mockFromString('/api/issues/search', '{}') + .clickElement('#coding-rules-quality-profile-activation-activate') + .checkElementExist('.coding-rules-detail-quality-profile-name') + .checkElementExist('.coding-rules-detail-quality-profile-name') + .checkElementExist('.coding-rules-detail-quality-profile-severity') + .checkElementExist('.coding-rules-detail-quality-profile-deactivate'); + }); + + bdd.it('should create custom rule', function () { + return this.remote + .open() + .mockFromFile('/api/rules/app', 'coding-rules-spec/app.json') + .mockFromFile('/api/rules/search', 'coding-rules-spec/search-custom-rules.json', + { data: { template_key: 'squid:ArchitecturalConstraint' } }) + .mockFromFile('/api/rules/search', 'coding-rules-spec/search-create-custom-rules.json') + .mockFromFile('/api/rules/show', 'coding-rules-spec/show-create-custom-rules.json') + .mockFromString('/api/rules/create', '{}') + .mockFromString('/api/issues/search', '{}') + .startApp('coding-rules') + .checkElementExist('.coding-rule.selected') + .clickElement('.coding-rule.selected .js-rule') + .checkElementExist('#coding-rules-detail-custom-rules .coding-rules-detail-list-name') + .clearMocks() + .mockFromString('/api/rules/create', '{}') + .mockFromFile('/api/rules/show', 'coding-rules-spec/show-create-custom-rules.json') + .mockFromFile('/api/rules/search', 'coding-rules-spec/search-custom-rules2.json') + .checkElementCount('#coding-rules-detail-custom-rules .coding-rules-detail-list-name', 1) + .clickElement('.js-create-custom-rule') + .fillElement('.modal form [name="name"]', 'test') + .fillElement('.modal form [name="markdown_description"]', 'test') + .clickElement('#coding-rules-custom-rule-creation-create') + .checkElementCount('#coding-rules-detail-custom-rules .coding-rules-detail-list-name', 2); + }); + + bdd.it('should reactivate custom rule', function () { + return this.remote + .open() + .mockFromFile('/api/rules/app', 'coding-rules-spec/app.json') + .mockFromFile('/api/rules/search', 'coding-rules-spec/search-custom-rules.json', + { data: { template_key: 'squid:ArchitecturalConstraint' } }) + .mockFromFile('/api/rules/search', 'coding-rules-spec/search-create-custom-rules.json') + .mockFromFile('/api/rules/show', 'coding-rules-spec/show-create-custom-rules.json') + .mockFromFile('/api/rules/create', 'coding-rules-spec/create-create-custom-rules.json', { status: 409 }) + .mockFromString('/api/issues/search', '{}') + .startApp('coding-rules') + .forceJSON() + .checkElementExist('.coding-rule.selected') + .clickElement('.coding-rule.selected .js-rule') + .checkElementExist('.js-create-custom-rule') + .clickElement('.js-create-custom-rule') + .checkElementExist('.modal') + .fillElement('.modal form [name="name"]', 'My Custom Rule') + .fillElement('.modal form [name="markdown_description"]', 'My Description') + .clickElement('#coding-rules-custom-rule-creation-create') + .checkElementExist('.modal .alert-warning') + .clearMocks() + .mockFromFile('/api/rules/create', 'coding-rules-spec/create-create-custom-rules.json') + .mockFromFile('/api/rules/search', 'coding-rules-spec/search-custom-rules2.json', + { data: { template_key: 'squid:ArchitecturalConstraint' } }) + .mockFromFile('/api/rules/search', 'coding-rules-spec/search-create-custom-rules.json') + .mockFromFile('/api/rules/show', 'coding-rules-spec/show-create-custom-rules.json') + .clickElement('.modal #coding-rules-custom-rule-creation-reactivate') + .checkElementCount('#coding-rules-detail-custom-rules .coding-rules-detail-list-name', 2); + }); + + bdd.it('should create manual rule', function () { + return this.remote + .open() + .mockFromFile('/api/rules/app', 'coding-rules-spec/app.json') + .mockFromFile('/api/rules/search', 'coding-rules-spec/search-create-manual-rule.json') + .mockFromFile('/api/rules/create', 'coding-rules-spec/show-create-manual-rule.json') + .mockFromFile('/api/rules/show', 'coding-rules-spec/show-create-manual-rule.json') + .mockFromString('/api/issues/search', '{}') + .startApp('coding-rules') + .checkElementExist('.js-create-manual-rule') + .clickElement('.js-create-manual-rule') + .checkElementExist('.modal') + .fillElement('.modal [name="name"]', 'Manual Rule') + .fillElement('.modal [name="markdown_description"]', 'Manual Rule Description') + .clickElement('.modal #coding-rules-manual-rule-creation-create') + .checkElementExist('.coding-rules-detail-header') + .checkElementInclude('.coding-rules-detail-header', 'Manual Rule') + .checkElementInclude('.coding-rule-details', 'manual:Manual_Rule') + .checkElementInclude('.coding-rules-detail-description', 'Manual Rule Description'); + }); + + bdd.it('should reactivate manual rule', function () { + return this.remote + .open() + .mockFromFile('/api/rules/app', 'coding-rules-spec/app.json') + .mockFromFile('/api/rules/search', 'coding-rules-spec/search-create-manual-rule.json') + .mockFromFile('/api/rules/create', 'coding-rules-spec/show-create-manual-rule.json', { status: 409 }) + .mockFromFile('/api/rules/show', 'coding-rules-spec/show-create-manual-rule.json') + .mockFromString('/api/issues/search', '{}') + .startApp('coding-rules') + .forceJSON() + .checkElementExist('.js-create-manual-rule') + .clickElement('.js-create-manual-rule') + .checkElementExist('.modal') + .checkElementExist('.modal #coding-rules-manual-rule-creation-create') + .fillElement('.modal [name="name"]', 'Manual Rule') + .fillElement('.modal [name="markdown_description"]', 'Manual Rule Description') + .clickElement('.modal #coding-rules-manual-rule-creation-create') + .checkElementExist('.modal .alert-warning') + .clearMocks() + .mockFromFile('/api/rules/create', 'coding-rules-spec/show.json') + .mockFromFile('/api/rules/show', 'coding-rules-spec/show-create-manual-rule.json') + .clickElement('.modal #coding-rules-manual-rule-creation-reactivate') + .checkElementExist('.coding-rules-detail-header') + .checkElementInclude('.coding-rules-detail-header', 'Manual Rule') + .checkElementInclude('.coding-rule-details', 'manual:Manual_Rule') + .checkElementInclude('.coding-rules-detail-description', 'Manual Rule Description'); + }); + + bdd.it('should delete custom rules', function () { + return this.remote + .open() + .mockFromFile('/api/rules/app', 'coding-rules-spec/app.json') + .mockFromFile('/api/rules/search', 'coding-rules-spec/search-delete-custom-rule-custom-rules.json', + { data: { template_key: 'squid:ArchitecturalConstraint' } }) + .mockFromFile('/api/rules/search', 'coding-rules-spec/search-delete-custom-rule.json') + .mockFromFile('/api/rules/show', 'coding-rules-spec/show-delete-custom-rule.json') + .mockFromString('/api/rules/delete', '{}') + .mockFromString('/api/issues/search', '{}') + .startApp('coding-rules') + .checkElementExist('.coding-rule.selected') + .clickElement('.coding-rule.selected .js-rule') + .checkElementExist('#coding-rules-detail-custom-rules .coding-rules-detail-list-name') + .checkElementCount('#coding-rules-detail-custom-rules .coding-rules-detail-list-name', 2) + .clickElement('.js-delete-custom-rule') + .clickElement('[data-confirm="yes"]') + .checkElementCount('#coding-rules-detail-custom-rules .coding-rules-detail-list-name', 1); + }); + + bdd.it('should delete manual rules', function () { + return this.remote + .open() + .mockFromFile('/api/rules/app', 'coding-rules-spec/app.json') + .mockFromFile('/api/rules/search', 'coding-rules-spec/search-delete-manual-rule-before.json') + .mockFromFile('/api/rules/show', 'coding-rules-spec/show-delete-manual-rule.json') + .mockFromString('/api/issues/search', '{}') + .startApp('coding-rules') + .forceJSON() + .checkElementExist('.coding-rule.selected') + .clickElement('.coding-rule.selected .js-rule') + .checkElementExist('.js-delete') + .clickElement('.js-delete') + .checkElementExist('[data-confirm="yes"]') + .clearMocks() + .mockFromFile('/api/rules/search', 'coding-rules-spec/search-delete-manual-rule-after.json') + .mockFromString('/api/rules/delete', '{}') + .clickElement('[data-confirm="yes"]') + .checkElementInclude('#coding-rules-total', 0); + }); + + bdd.it('should show custom rules', function () { + return this.remote + .open() + .mockFromFile('/api/rules/app', 'coding-rules-spec/app.json') + .mockFromFile('/api/rules/search', 'coding-rules-spec/search-show-cutsom-rule-custom-rules.json', + { data: { template_key: 'squid:ArchitecturalConstraint' } }) + .mockFromFile('/api/rules/search', 'coding-rules-spec/search-show-cutsom-rule.json') + .mockFromFile('/api/rules/show', 'coding-rules-spec/show-show-cutsom-rule.json') + .mockFromString('/api/issues/search', '{}') + .startApp('coding-rules') + .checkElementExist('.coding-rule.selected') + .clickElement('.coding-rule.selected .js-rule') + .checkElementExist('#coding-rules-detail-custom-rules .coding-rules-detail-list-name') + .checkElementExist('#coding-rules-detail-custom-rules') + .checkElementCount('#coding-rules-detail-custom-rules .coding-rules-detail-list-name', 2) + .checkElementInclude('#coding-rules-detail-custom-rules .coding-rules-detail-list-name', + 'Do not use org.h2.util.StringUtils'); + }); + + bdd.it('should show deprecated label', function () { + return this.remote + .open() + .mockFromFile('/api/rules/app', 'coding-rules-spec/app.json') + .mockFromFile('/api/rules/search', 'coding-rules-spec/search-deprecated.json') + .startApp('coding-rules') + .checkElementExist('.coding-rule.selected') + .checkElementInclude('.coding-rule.selected', 'DEPRECATED'); + }); + + bdd.it('should show rule details', function () { + return this.remote + .open() + .mockFromFile('/api/rules/app', 'coding-rules-spec/app.json') + .mockFromFile('/api/rules/search', 'coding-rules-spec/search-show-details.json') + .mockFromFile('/api/rules/show', 'coding-rules-spec/show-show-details.json') + .mockFromString('/api/issues/search', '{}') + .startApp('coding-rules') + .checkElementExist('.coding-rule.selected') + .clickElement('.coding-rule.selected .js-rule') + .checkElementExist('.coding-rules-detail-header') + .checkElementInclude('.search-navigator-workspace-details', + 'Throwable and Error classes should not be caught') + .checkElementInclude('.search-navigator-workspace-details', 'squid:S1181') + .checkElementExist('.coding-rules-detail-properties .icon-severity-blocker') + .checkElementInclude('.coding-rules-detail-properties', 'error-handling') + .checkElementInclude('.coding-rules-detail-properties', '2013') + .checkElementInclude('.coding-rules-detail-properties', 'SonarQube (Java)') + .checkElementInclude('.coding-rules-detail-properties', 'Reliability > Exception handling') + .checkElementInclude('.coding-rules-detail-properties', 'LINEAR') + .checkElementInclude('.coding-rules-detail-properties', '20min') + + .checkElementInclude('.coding-rules-detail-description', 'is the superclass of all errors and') + .checkElementInclude('.coding-rules-detail-description', 'its subclasses should be caught.') + .checkElementInclude('.coding-rules-detail-description', 'Noncompliant Code Example') + .checkElementInclude('.coding-rules-detail-description', 'Compliant Solution') + + .checkElementInclude('.coding-rules-detail-parameters', 'max') + .checkElementInclude('.coding-rules-detail-parameters', 'Maximum authorized number of parameters') + .checkElementInclude('.coding-rules-detail-parameters', '7') + + .checkElementCount('.coding-rules-detail-quality-profile-name', 6) + .checkElementInclude('.coding-rules-detail-quality-profile-name', 'Default - Top') + .checkElementCount('.coding-rules-detail-quality-profile-inheritance', 4) + .checkElementInclude('.coding-rules-detail-quality-profile-inheritance', 'Default - Top'); + }); + + bdd.it('should show empty list', function () { + return this.remote + .open() + .mockFromFile('/api/rules/app', 'coding-rules-spec/app.json') + .mockFromFile('/api/rules/search', 'coding-rules-spec/search-empty.json') + .startApp('coding-rules') + .checkElementExist('.search-navigator-facet-box') + .checkElementNotExist('.coding-rule') + .checkElementInclude('#coding-rules-total', 0) + .checkElementExist('.search-navigator-no-results'); + }); + + bdd.it('should show facets', function () { + return this.remote + .open() + .mockFromFile('/api/rules/app', 'coding-rules-spec/app.json') + .mockFromFile('/api/rules/search', 'coding-rules-spec/search.json') + .startApp('coding-rules') + .checkElementExist('.search-navigator-facet-box') + .checkElementCount('.search-navigator-facet-box', 13); + }); + + bdd.it('should show rule', function () { + return this.remote + .open() + .mockFromFile('/api/rules/app', 'coding-rules-spec/app.json') + .mockFromFile('/api/rules/search', 'coding-rules-spec/search.json') + .startApp('coding-rules') + .checkElementExist('.coding-rule.selected') + .checkElementInclude('.coding-rule.selected', 'Values passed to SQL commands should be sanitized') + .checkElementInclude('.coding-rule.selected', 'Java') + .checkElementInclude('.coding-rule.selected', 'cwe') + .checkElementInclude('.coding-rule.selected', 'owasp-top10') + .checkElementInclude('.coding-rule.selected', 'security') + .checkElementInclude('.coding-rule.selected', 'sql') + .checkElementInclude('.coding-rule.selected', 'custom-tag'); + }); + + bdd.it('should show rule issues', function () { + return this.remote + .open() + .mockFromFile('/api/rules/app', 'coding-rules-spec/app.json') + .mockFromFile('/api/rules/search', 'coding-rules-spec/search.json') + .mockFromFile('/api/rules/show', 'coding-rules-spec/show.json') + .mockFromFile('/api/issues/search', 'coding-rules-spec/issues-search.json') + .startApp('coding-rules') + .checkElementExist('.coding-rule.selected') + .clickElement('.coding-rule.selected .js-rule') + .checkElementExist('.coding-rules-most-violated-projects') + .checkElementInclude('.js-rule-issues', '7') + .checkElementInclude('.coding-rules-most-violated-projects', 'SonarQube') + .checkElementInclude('.coding-rules-most-violated-projects', '2') + .checkElementInclude('.coding-rules-most-violated-projects', 'SonarQube Runner') + .checkElementInclude('.coding-rules-most-violated-projects', '1'); + }); + + bdd.it('should show rules', function () { + return this.remote + .open() + .mockFromFile('/api/rules/app', 'coding-rules-spec/app.json') + .mockFromFile('/api/rules/search', 'coding-rules-spec/search.json') + .startApp('coding-rules') + .checkElementExist('.coding-rule') + .checkElementCount('.coding-rule', 25) + .checkElementInclude('.coding-rule', 'Values passed to SQL commands should be sanitized') + .checkElementInclude('.coding-rule', 'An open curly brace should be located at the beginning of a line') + .checkElementInclude('#coding-rules-total', '609'); + }); + + bdd.it('should move between rules from detailed view', function () { + return this.remote + .open() + .mockFromFile('/api/rules/app', 'coding-rules-spec/app.json') + .mockFromFile('/api/rules/search', 'coding-rules-spec/search.json') + .mockFromFile('/api/rules/show', 'coding-rules-spec/show.json') + .startApp('coding-rules') + .checkElementExist('.coding-rule.selected') + .clickElement('.coding-rule.selected .js-rule') + .checkElementExist('.coding-rules-detail-header') + .checkElementInclude('.coding-rules-detail-header', + '".equals()" should not be used to test the values') + .clearMocks() + .mockFromFile('/api/rules/show', 'coding-rules-spec/show2.json') + .clickElement('.js-next') + .checkElementInclude('.coding-rules-detail-header', '"@Override" annotation should be used on any') + .clearMocks() + .mockFromFile('/api/rules/show', 'coding-rules-spec/show.json') + .clickElement('.js-prev') + .checkElementInclude('.coding-rules-detail-header', '".equals()" should not be used to test the values'); + }); + + bdd.it('should filter similar rules', function () { + return this.remote + .open() + .mockFromFile('/api/rules/app', 'coding-rules-spec/app.json') + .mockFromFile('/api/rules/search', 'coding-rules-spec/search-sql-tag.json', { data: { tags: 'sql' } }) + .mockFromFile('/api/rules/search', 'coding-rules-spec/search.json') + .startApp('coding-rules') + .checkElementExist('.coding-rule.selected .js-rule-filter') + .checkElementInclude('#coding-rules-total', '609') + .clickElement('.js-rule-filter') + .checkElementExist('.bubble-popup') + .checkElementExist('.bubble-popup [data-property="languages"][data-value="java"]') + .clickElement('.bubble-popup [data-property="tags"][data-value="sql"]') + .checkElementInclude('#coding-rules-total', '2'); + }); + + bdd.it('should show active severity facet', function () { + return this.remote + .open() + .mockFromFile('/api/rules/app', 'coding-rules-spec/app.json') + .mockFromFile('/api/rules/search', 'coding-rules-spec/search-BLOCKER.json', + { data: { active_severities: 'BLOCKER' } }) + .mockFromFile('/api/rules/search', 'coding-rules-spec/active-severities-facet.json', + { data: { facets: 'active_severities', ps: '1' } }) + .mockFromFile('/api/rules/search', 'coding-rules-spec/search-qprofile.json', + { data: { qprofile: 'java-default-with-mojo-conventions-49307' } }) + .mockFromFile('/api/rules/search', 'coding-rules-spec/search.json') + .startApp('coding-rules') + .checkElementExist('.coding-rule') + .checkElementInclude('#coding-rules-total', '609') + .checkElementExist('.search-navigator-facet-box-forbidden[data-property="active_severities"]') + .clickElement('[data-property="qprofile"] .js-facet-toggle') + .checkElementExist('.js-facet[data-value="java-default-with-mojo-conventions-49307"]') + .clickElement('.js-facet[data-value="java-default-with-mojo-conventions-49307"]') + .checkElementInclude('#coding-rules-total', '407') + .checkElementNotExist('.search-navigator-facet-box-forbidden[data-property="active_severities"]') + .clickElement('[data-property="active_severities"] .js-facet-toggle') + .checkElementExist('[data-property="active_severities"] [data-value="BLOCKER"]') + .clickElement('[data-property="active_severities"] [data-value="BLOCKER"]') + .checkElementInclude('#coding-rules-total', '4') + .clickElement('[data-property="qprofile"] .js-facet-toggle') + .checkElementInclude('#coding-rules-total', '609') + .checkElementExist('.search-navigator-facet-box-forbidden[data-property="active_severities"]'); + }); + + bdd.it('should show available since facet', function () { + return this.remote + .open() + .mockFromFile('/api/rules/app', 'coding-rules-spec/app.json') + .mockFromFile('/api/rules/search', 'coding-rules-spec/search-limited.json', + { data: { available_since: '2014-12-01' } }) + .mockFromFile('/api/rules/search', 'coding-rules-spec/search.json') + .startApp('coding-rules') + .checkElementExist('.coding-rule') + .checkElementInclude('#coding-rules-total', '609') + .clickElement('[data-property="available_since"] .js-facet-toggle') + .fillElement('[data-property="available_since"] input', '2014-12-01') + .execute(function () { + // TODO do not use jQuery + jQuery('[data-property="available_since"] input').change(); + }) + .checkElementInclude('#coding-rules-total', '101'); + }); + + bdd.it('should bulk activate', function () { + return this.remote + .open() + .mockFromFile('/api/rules/app', 'coding-rules-spec/app.json') + .mockFromFile('/api/rules/search', 'coding-rules-spec/search.json') + .mockFromString('/api/qualityprofiles/activate_rules', '{ "succeeded": 225 }') + .startApp('coding-rules') + .forceJSON() + .checkElementExist('.coding-rule') + .checkElementExist('.js-bulk-change') + .clickElement('.js-bulk-change') + .checkElementExist('.bubble-popup') + .checkElementExist('.bubble-popup .js-bulk-change[data-action="activate"]') + .clickElement('.js-bulk-change[data-action="activate"]') + .checkElementExist('.modal') + .checkElementExist('.modal #coding-rules-bulk-change-profile') + .checkElementExist('.modal #coding-rules-submit-bulk-change') + .fillElement('#coding-rules-bulk-change-profile', 'java-default-with-mojo-conventions-49307') + .clickElement('.modal #coding-rules-submit-bulk-change') + .checkElementExist('.modal .alert-success') + .checkElementInclude('.modal', 'Default - Maven Conventions') + .checkElementInclude('.modal', 'Java') + .checkElementInclude('.modal', '225'); + }); + + bdd.it('should fail to bulk activate', function () { + return this.remote + .open() + .mockFromFile('/api/rules/app', 'coding-rules-spec/app.json') + .mockFromFile('/api/rules/search', 'coding-rules-spec/search.json') + .mockFromString('/api/qualityprofiles/activate_rules', '{ "succeeded": 225, "failed": 395 }') + .startApp('coding-rules') + .forceJSON() + .checkElementExist('.coding-rule') + .checkElementExist('.js-bulk-change') + .clickElement('.js-bulk-change') + .checkElementExist('.bubble-popup') + .checkElementExist('.bubble-popup .js-bulk-change[data-action="activate"]') + .clickElement('.js-bulk-change[data-action="activate"]') + .checkElementExist('.modal') + .checkElementExist('.modal #coding-rules-bulk-change-profile') + .checkElementExist('.modal #coding-rules-submit-bulk-change') + .fillElement('#coding-rules-bulk-change-profile', 'java-default-with-mojo-conventions-49307') + .clickElement('.modal #coding-rules-submit-bulk-change') + .checkElementExist('.modal .alert-warning') + .checkElementInclude('.modal', '225') + .checkElementInclude('.modal', '395'); + }); + + bdd.it('should filter profiles by language during bulk change', function () { + return this.remote + .open() + .mockFromFile('/api/rules/app', 'coding-rules-spec/app.json') + .mockFromFile('/api/rules/search', 'coding-rules-spec/search.json') + .startApp('coding-rules') + .checkElementExist('.coding-rule') + .clickElement('.js-facet[data-value="java"]') + .checkElementExist('.js-bulk-change') + .clickElement('.js-bulk-change') + .checkElementExist('.bubble-popup') + .checkElementExist('.bubble-popup .js-bulk-change[data-action="activate"]') + .clickElement('.js-bulk-change[data-action="activate"]') + .checkElementExist('.modal') + .checkElementExist('.modal #coding-rules-bulk-change-profile') + .checkElementCount('.modal #coding-rules-bulk-change-profile option', 8); + }); + + bdd.it('should change selected profile during bulk change', function () { + return this.remote + .open() + .mockFromFile('/api/rules/app', 'coding-rules-spec/app.json') + .mockFromFile('/api/rules/search', 'coding-rules-spec/search-qprofile-active.json', + { data: { activation: true } }) + .mockFromFile('/api/rules/search', 'coding-rules-spec/search.json') + .mockFromString('/api/qualityprofiles/deactivate_rules', '{ "succeeded": 7 }') + .startApp('coding-rules') + .checkElementExist('.coding-rule') + .clickElement('[data-property="qprofile"] .js-facet-toggle') + .checkElementExist('.js-facet[data-value="java-default-with-mojo-conventions-49307"]') + .clickElement('.js-facet[data-value="java-default-with-mojo-conventions-49307"]') + .checkElementExist('.js-bulk-change') + .clickElement('.js-bulk-change') + .checkElementExist('.bubble-popup') + .checkElementExist('.bubble-popup .js-bulk-change[data-param="java-default-with-mojo-conventions-49307"]') + .clickElement('.js-bulk-change[data-param="java-default-with-mojo-conventions-49307"]') + .checkElementExist('.modal') + .checkElementNotExist('.modal #coding-rules-bulk-change-profile') + .clickElement('.modal #coding-rules-submit-bulk-change') + .checkElementExist('.modal .alert-success') + .checkElementInclude('.modal', '7'); + }); + + bdd.it('should show characteristic facet', function () { + return this.remote + .open() + .mockFromString('/api/l10n/index', '{}') + .mockFromFile('/api/rules/app', 'coding-rules-spec/app.json') + .mockFromFile('/api/rules/search', 'coding-rules-spec/search-with-portability-characteristic.json', + { data: { debt_characteristics: 'PORTABILITY' } }) + .mockFromFile('/api/rules/search', 'coding-rules-spec/search-with-memory-efficiency-characteristic.json', + { data: { debt_characteristics: 'MEMORY_EFFICIENCY' } }) + .mockFromFile('/api/rules/search', 'coding-rules-spec/search-without-characteristic.json', + { data: { has_debt_characteristic: 'false' } }) + .mockFromFile('/api/rules/search', 'coding-rules-spec/search-characteristic.json', + { data: { facets: 'debt_characteristics' } }) + .mockFromFile('/api/rules/search', 'coding-rules-spec/search.json') + .startApp('coding-rules') + .checkElementExist('.coding-rule') + .checkElementExist('.search-navigator-facet-box-collapsed[data-property="debt_characteristics"]') + .clickElement('[data-property="debt_characteristics"] .js-facet-toggle') + .checkElementExist('.js-facet[data-value="PORTABILITY"]') + .checkElementCount('[data-property="debt_characteristics"] .js-facet', 32) + .checkElementCount('[data-property="debt_characteristics"] .js-facet.search-navigator-facet-indent', 24) + .clickElement('.js-facet[data-value="PORTABILITY"]') + .checkElementInclude('#coding-rules-total', 21) + .clickElement('.js-facet[data-empty-characteristic]') + .checkElementInclude('#coding-rules-total', 208) + .clickElement('.js-facet[data-value="MEMORY_EFFICIENCY"]') + .checkElementInclude('#coding-rules-total', 3); + }); + + bdd.it('should disable characteristic facet', function () { + return this.remote + .open() + .mockFromString('/api/l10n/index', '{}') + .mockFromFile('/api/rules/app', 'coding-rules-spec/app.json') + .mockFromFile('/api/rules/search', 'coding-rules-spec/search-with-portability-characteristic.json', + { data: { debt_characteristics: 'PORTABILITY' } }) + .mockFromFile('/api/rules/search', 'coding-rules-spec/search-with-memory-efficiency-characteristic.json', + { data: { debt_characteristics: 'MEMORY_EFFICIENCY' } }) + .mockFromFile('/api/rules/search', 'coding-rules-spec/search-without-characteristic.json', + { data: { has_debt_characteristic: 'false' } }) + .mockFromFile('/api/rules/search', 'coding-rules-spec/search-characteristic.json', + { data: { facets: 'debt_characteristics' } }) + .mockFromFile('/api/rules/search', 'coding-rules-spec/search.json') + .startApp('coding-rules') + .checkElementExist('.coding-rule') + .clickElement('[data-property="debt_characteristics"] .js-facet-toggle') + .checkElementExist('.js-facet[data-value="PORTABILITY"]') + .clickElement('.js-facet[data-value="PORTABILITY"]') + .checkElementInclude('#coding-rules-total', 21) + .clickElement('[data-property="debt_characteristics"] .js-facet-toggle') + .checkElementInclude('#coding-rules-total', 609) + .clickElement('[data-property="debt_characteristics"] .js-facet-toggle') + .checkElementExist('.js-facet[data-value="MEMORY_EFFICIENCY"]') + .clickElement('.js-facet[data-value="MEMORY_EFFICIENCY"]') + .checkElementInclude('#coding-rules-total', 3) + .clickElement('[data-property="debt_characteristics"] .js-facet-toggle') + .checkElementInclude('#coding-rules-total', 609) + .clickElement('[data-property="debt_characteristics"] .js-facet-toggle') + .checkElementExist('.js-facet[data-empty-characteristic]') + .clickElement('.js-facet[data-empty-characteristic]') + .checkElementInclude('#coding-rules-total', 208) + .clickElement('[data-property="debt_characteristics"] .js-facet-toggle') + .checkElementInclude('#coding-rules-total', 609); + }); + + bdd.it('should show template facet', function () { + return this.remote + .open() + .mockFromString('/api/l10n/index', '{}') + .mockFromFile('/api/rules/app', 'coding-rules-spec/app.json') + .mockFromFile('/api/rules/search', 'coding-rules-spec/search-only-templates.json', + { data: { 'is_template': 'true' } }) + .mockFromFile('/api/rules/search', 'coding-rules-spec/search-hide-templates.json', + { data: { 'is_template': 'false' } }) + .mockFromFile('/api/rules/search', 'coding-rules-spec/search.json') + .startApp('coding-rules') + .checkElementExist('.coding-rule') + .checkElementExist('.search-navigator-facet-box-collapsed[data-property="is_template"]') + .clickElement('[data-property="is_template"] .js-facet-toggle') + .checkElementExist('[data-property="is_template"] .js-facet[data-value="true"]') + .clickElement('[data-property="is_template"] .js-facet[data-value="true"]') + .checkElementInclude('#coding-rules-total', 8) + .clickElement('[data-property="is_template"] .js-facet[data-value="false"]') + .checkElementInclude('#coding-rules-total', 7) + .clickElement('[data-property="is_template"] .js-facet-toggle') + .checkElementInclude('#coding-rules-total', 609); + }); + + bdd.it('should show language facet', function () { + return this.remote + .open() + .mockFromString('/api/l10n/index', '{}') + .mockFromFile('/api/rules/app', 'coding-rules-spec/app.json') + .mockFromFile('/api/rules/search', 'coding-rules-spec/search-with-custom-language.json', + { data: { languages: 'custom' } }) + .mockFromFile('/api/rules/search', 'coding-rules-spec/search.json') + .mockFromString('/api/languages/list', '{"languages":[{"key":"custom","name":"Custom"}]}', + { data: { q: 'custom' } }) + .startApp('coding-rules') + .checkElementExist('.coding-rule') + .clickElement('[data-property="languages"] .select2-choice') + .checkElementExist('.select2-search') + .fillElement('.select2-input', 'custom') + .execute(function () { + // TODO remove jQuery usage + jQuery('.select2-input').trigger('keyup-change'); + }) + .checkElementExist('.select2-result') + .checkElementInclude('.select2-result', 'Custom') + .execute(function () { + // TODO remove jQuery usage + jQuery('.select2-result').mouseup(); + }) + .checkElementInclude('#coding-rules-total', 13) + .checkElementExist('[data-property="languages"] .js-facet.active') + .checkElementInclude('[data-property="languages"] .js-facet.active', 'custom') + .checkElementInclude('[data-property="languages"] .js-facet.active', '13'); + }); + + bdd.it('should reload results', function () { + return this.remote + .open() + .mockFromString('/api/l10n/index', '{}') + .mockFromFile('/api/rules/app', 'coding-rules-spec/app.json') + .mockFromFile('/api/rules/search', 'coding-rules-spec/search.json') + .startApp('coding-rules') + .checkElementExist('.coding-rule') + .checkElementInclude('#coding-rules-total', 609) + .clearMocks() + .mockFromFile('/api/rules/search', 'coding-rules-spec/search2.json') + .clickElement('.js-reload') + .checkElementInclude('#coding-rules-total', 413); + }); + + bdd.it('should do a new search', function () { + return this.remote + .open() + .mockFromString('/api/l10n/index', '{}') + .mockFromFile('/api/rules/app', 'coding-rules-spec/app.json') + .mockFromFile('/api/rules/search', 'coding-rules-spec/search2.json', { data: { languages: 'java' } }) + .mockFromFile('/api/rules/search', 'coding-rules-spec/search.json') + .startApp('coding-rules') + .checkElementExist('.coding-rule') + .checkElementInclude('#coding-rules-total', 609) + .clickElement('.js-facet[data-value="java"]') + .checkElementInclude('#coding-rules-total', 413) + .clickElement('.js-new-search') + .checkElementInclude('#coding-rules-total', 609); + }); + + bdd.it('should go back', function () { + return this.remote + .open() + .mockFromString('/api/l10n/index', '{}') + .mockFromFile('/api/rules/app', 'coding-rules-spec/app.json') + .mockFromFile('/api/rules/search', 'coding-rules-spec/search.json') + .mockFromFile('/api/rules/show', 'coding-rules-spec/show.json') + .startApp('coding-rules') + .checkElementExist('.coding-rule.selected') + .clickElement('.coding-rule.selected .js-rule') + .checkElementExist('.coding-rules-detail-header') + .clickElement('.js-back') + .checkElementNotExist('.js-back') + .checkElementNotExist('.coding-rules-detail-header'); + }); + + bdd.it('should show inheritance facet', function () { + return this.remote + .open() + .mockFromFile('/api/rules/app', 'coding-rules-spec/app.json') + .mockFromFile('/api/rules/search', 'coding-rules-spec/search-not-inherited.json', + { data: { inheritance: 'NONE' } }) + .mockFromFile('/api/rules/search', 'coding-rules-spec/search-inherited.json', + { data: { inheritance: 'INHERITED' } }) + .mockFromFile('/api/rules/search', 'coding-rules-spec/search-overriden.json', + { data: { inheritance: 'OVERRIDES' } }) + .mockFromFile('/api/rules/search', 'coding-rules-spec/search-qprofile.json', + { data: { qprofile: 'java-default-with-mojo-conventions-49307' } }) + .mockFromFile('/api/rules/search', 'coding-rules-spec/search-qprofile2.json', + { data: { qprofile: 'java-top-profile-without-formatting-conventions-50037' } }) + .mockFromFile('/api/rules/search', 'coding-rules-spec/search.json') + .startApp('coding-rules') + .checkElementExist('.coding-rule') + .checkElementInclude('#coding-rules-total', '609') + .checkElementExist('.search-navigator-facet-box-forbidden[data-property="inheritance"]') + .clickElement('[data-property="qprofile"] .js-facet-toggle') + .checkElementExist('.js-facet[data-value="java-default-with-mojo-conventions-49307"]') + .clickElement('.js-facet[data-value="java-default-with-mojo-conventions-49307"]') + .checkElementInclude('#coding-rules-total', '407') + .checkElementNotExist('.search-navigator-facet-box-forbidden[data-property="inheritance"]') + .clickElement('[data-property="inheritance"] .js-facet-toggle') + .checkElementExist('[data-property="inheritance"] [data-value="NONE"]') + .clickElement('[data-property="inheritance"] [data-value="NONE"]') + .checkElementInclude('#coding-rules-total', '103') + .clickElement('[data-property="inheritance"] [data-value="INHERITED"]') + .checkElementInclude('#coding-rules-total', '101') + .clickElement('[data-property="inheritance"] [data-value="OVERRIDES"]') + .checkElementInclude('#coding-rules-total', '102') + .clickElement('.js-facet[data-value="java-top-profile-without-formatting-conventions-50037"]') + .checkElementInclude('#coding-rules-total', '408') + .checkElementExist('.search-navigator-facet-box-forbidden[data-property="inheritance"]') + .clickElement('[data-property="qprofile"] .js-facet-toggle') + .checkElementInclude('#coding-rules-total', '609') + .checkElementExist('.search-navigator-facet-box-forbidden[data-property="inheritance"]'); + }); + + bdd.it('should show activation details', function () { + return this.remote + .open() + .mockFromString('/api/l10n/index', '{}') + .mockFromFile('/api/rules/app', 'coding-rules-spec/app.json') + .mockFromFile('/api/rules/search', 'coding-rules-spec/search-actives.json', { data: { activation: true } }) + .mockFromFile('/api/rules/search', 'coding-rules-spec/search.json') + .startApp('coding-rules') + .checkElementExist('.coding-rule') + .checkElementNotExist('.coding-rule-activation') + .clickElement('[data-property="qprofile"] .js-facet-toggle') + .checkElementExist('.js-facet[data-value="java-default-with-mojo-conventions-49307"]') + .clickElement('.js-facet[data-value="java-default-with-mojo-conventions-49307"]') + .checkElementCount('.coding-rule-activation', 2) + .checkElementCount('.coding-rule-activation .icon-severity-major', 2) + .checkElementCount('.coding-rule-activation .icon-inheritance', 1) + .checkElementNotExist('.coding-rules-detail-quality-profile-activate'); + }); + + bdd.it('should activate rule', function () { + return this.remote + .open() + .mockFromString('/api/l10n/index', '{}') + .mockFromFile('/api/rules/app', 'coding-rules-spec/app.json') + .mockFromFile('/api/rules/search', 'coding-rules-spec/search-inactive.json', + { data: { activation: 'false' } }) + .mockFromFile('/api/rules/search', 'coding-rules-spec/search.json') + .mockFromString('/api/qualityprofiles/activate_rule', '{}') + .startApp('coding-rules') + .checkElementExist('.coding-rule') + .checkElementNotExist('.coding-rule-activation') + .clickElement('[data-property="qprofile"] .js-facet-toggle') + .checkElementExist('.js-facet[data-value="java-default-with-mojo-conventions-49307"]') + .clickElement('.js-facet[data-value="java-default-with-mojo-conventions-49307"]') + .clickElement('.js-facet[data-value="java-default-with-mojo-conventions-49307"] .js-inactive') + .checkElementNotExist('.coding-rule-activation .icon-severity-major') + .checkElementExist('.coding-rules-detail-quality-profile-activate') + .clickElement('.coding-rules-detail-quality-profile-activate') + .checkElementExist('.modal') + .checkElementExist('#coding-rules-quality-profile-activation-select') + .checkElementCount('#coding-rules-quality-profile-activation-select option', 1) + .checkElementExist('#coding-rules-quality-profile-activation-severity') + .clickElement('#coding-rules-quality-profile-activation-activate') + .checkElementExist('.coding-rule-activation .icon-severity-major') + .checkElementExist('.coding-rule-activation .icon-severity-major') + .checkElementNotExist('.coding-rules-detail-quality-profile-activate') + .checkElementExist('.coding-rules-detail-quality-profile-deactivate'); + }); + + bdd.it('should deactivate rule', function () { + return this.remote + .open() + .mockFromString('/api/l10n/index', '{}') + .mockFromFile('/api/rules/app', 'coding-rules-spec/app.json') + .mockFromFile('/api/rules/search', 'coding-rules-spec/search-active.json', { data: { activation: true } }) + .mockFromFile('/api/rules/search', 'coding-rules-spec/search.json') + .mockFromString('/api/qualityprofiles/deactivate_rule', '{}') + .startApp('coding-rules') + .checkElementExist('.coding-rule') + .checkElementNotExist('.coding-rule-activation') + .clickElement('[data-property="qprofile"] .js-facet-toggle') + .checkElementExist('.js-facet[data-value="java-default-with-mojo-conventions-49307"]') + .clickElement('.js-facet[data-value="java-default-with-mojo-conventions-49307"]') + .checkElementExist('.coding-rule-activation .icon-severity-major') + .checkElementNotExist('.coding-rules-detail-quality-profile-activate') + .clickElement('.coding-rules-detail-quality-profile-deactivate') + .checkElementExist('button[data-confirm="yes"]') + .clickElement('button[data-confirm="yes"]') + .checkElementNotExist('.coding-rule-activation .icon-severity-major') + .checkElementNotExist('.coding-rule-activation .icon-severity-major') + .checkElementExist('.coding-rules-detail-quality-profile-activate') + .checkElementNotExist('.coding-rules-detail-quality-profile-deactivate'); + }); + }); +}); -- 2.39.5