From ca113ae7a42a66442502cea211343a6916bf1d66 Mon Sep 17 00:00:00 2001 From: Stas Vilchik Date: Wed, 23 Jul 2014 17:59:01 +0200 Subject: [PATCH] Component Viewer Tests: add decoration tests --- .../tests/e2e/tests/component-viewer-spec.js | 143 +++- .../tests/component-viewer-spec/coverage.json | 196 ++++++ .../component-viewer-spec/duplications.json | 25 + .../tests/component-viewer-spec/issues.json | 646 ++++++++++++++++++ .../e2e/tests/component-viewer-spec/scm.json | 184 +++++ 5 files changed, 1159 insertions(+), 35 deletions(-) create mode 100644 server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-spec/coverage.json create mode 100644 server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-spec/duplications.json create mode 100644 server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-spec/issues.json create mode 100644 server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-spec/scm.json diff --git a/server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-spec.js b/server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-spec.js index c807e35569f..1058b8a1838 100644 --- a/server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-spec.js +++ b/server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-spec.js @@ -5,39 +5,112 @@ lib.changeWorkingDirectory('component-viewer-spec'); casper.test.begin('Component Viewer Base Tests', function (test) { - casper.start(lib.buildUrl('component-viewer#component=component'), function () { - lib.setDefaultViewport(); - - lib.mockRequest('/api/l10n/index', '{}'); - lib.mockRequestFromFile('/api/components/app', 'app.json'); - lib.mockRequestFromFile('/api/sources/show', 'source.json'); - }); - - casper.wait(1000, function () { - - // Check header elements - test.assertElementCount('.component-viewer-header', 1); - test.assertSelectorContains('.component-viewer-header-component-project', 'SonarQube'); - test.assertSelectorContains('.component-viewer-header-component-project', 'SonarQube :: Batch'); - test.assertSelectorContains('.component-viewer-header-component-name', - 'src/main/java/org/sonar/batch/index/Cache.java'); - test.assertElementCount('.component-viewer-header-favorite', 1); - test.assertElementCount('.component-viewer-header-actions', 1); - - // Check main measures - test.assertSelectorContains('.js-header-tab-basic', '379'); - test.assertSelectorContains('.js-header-tab-issues', 'A'); - test.assertSelectorContains('.js-header-tab-issues', '3h 30min'); - test.assertSelectorContains('.js-header-tab-issues', '6'); - test.assertSelectorContains('.js-header-tab-coverage', '74.3%'); - test.assertElementCount('.js-header-tab-scm', 1); - - // Check source - test.assertElementCount('.component-viewer-source .row', 520); - test.assertSelectorContains('.component-viewer-source', 'public class Cache'); - }); - - casper.run(function () { - test.done(); - }); + casper + .start(lib.buildUrl('component-viewer#component=component'), function () { + lib.setDefaultViewport(); + + lib.mockRequest('/api/l10n/index', '{}'); + lib.mockRequestFromFile('/api/components/app', 'app.json'); + lib.mockRequestFromFile('/api/sources/show', 'source.json'); + lib.mockRequestFromFile('/api/issues/search', 'issues.json'); + lib.mockRequestFromFile('/api/coverage/show', 'coverage.json'); + lib.mockRequestFromFile('/api/duplications/show', 'duplications.json'); + lib.mockRequestFromFile('/api/sources/scm', 'scm.json'); + lib.mockRequest('*', '{}'); // Trick to see all ajax requests + }) + + .then(function () { + casper.waitForSelector('.component-viewer-source .row', function () { + + // Check header elements + test.assertElementCount('.component-viewer-header', 1); + test.assertSelectorContains('.component-viewer-header-component-project', 'SonarQube'); + test.assertSelectorContains('.component-viewer-header-component-project', 'SonarQube :: Batch'); + test.assertSelectorContains('.component-viewer-header-component-name', + 'src/main/java/org/sonar/batch/index/Cache.java'); + test.assertElementCount('.component-viewer-header-favorite', 1); + test.assertElementCount('.component-viewer-header-actions', 1); + + // Check main measures + test.assertSelectorContains('.js-header-tab-basic', '379'); + test.assertSelectorContains('.js-header-tab-issues', 'A'); + test.assertSelectorContains('.js-header-tab-issues', '3h 30min'); + test.assertSelectorContains('.js-header-tab-issues', '6'); + test.assertSelectorContains('.js-header-tab-coverage', '74.3%'); + test.assertElementCount('.js-header-tab-scm', 1); + + // Check source + test.assertElementCount('.component-viewer-source .row', 520); + test.assertSelectorContains('.component-viewer-source', 'public class Cache'); + + // Check workspace + test.assertElementCount('.component-viewer-workspace', 1); + }); + }) + + .then(function() { + // Check issues decoration + casper.click('.js-toggle-issues'); + casper.waitForSelector('.code-issue', function () { + test.assertElementCount('.code-issue', 6); + test.assertSelectorContains('.code-issue', '2 duplicated blocks of code.'); + + casper.click('.js-toggle-issues'); + casper.waitWhileSelector('.code-issue', function () { + test.assertElementCount('.code-issue', 0); + }); + }); + }) + + .then(function () { + // Check coverage decoration + casper.click('.js-toggle-coverage'); + casper.waitForSelector('.coverage-green', function () { + test.assertElementCount('.coverage-green', 149); + test.assertSelectorContains('.coverage-green', '27'); + test.assertElementCount('.coverage-red', 51); + test.assertElementCount('.coverage-orange', 2); + test.assertSelectorContains('.coverage-orange', '1/2'); + + casper.click('.js-toggle-coverage'); + casper.waitWhileSelector('.coverage-green', function () { + test.assertElementCount('.coverage-green', 0); + }); + }); + }) + + .then(function () { + // Check duplications decoration + casper.click('.js-toggle-duplications'); + casper.waitForSelector('.duplication-exists', function () { + test.assertElementCount('.duplication-exists', 32); + + casper.click('.js-toggle-duplications'); + casper.waitWhileSelector('.duplication-exists', function () { + test.assertElementCount('.duplication-exists', 0); + }); + }); + }) + + .then(function () { + // Check scm decoration + casper.click('.js-toggle-scm'); + casper.waitForSelector('.scm-author', function () { + test.assertElementCount('.scm-author', 182); + test.assertElementCount('.scm-date', 182); + test.assertSelectorContains('.scm-author', 'simon.brandhof@gmail.com'); + test.assertSelectorContains('.scm-author', 'julien.henry@sonarsource.com'); + test.assertSelectorContains('.scm-date', '2014-02-20'); + + casper.click('.js-toggle-scm'); + casper.waitWhileSelector('.scm-author', function () { + test.assertElementCount('.scm-author', 0); + test.assertElementCount('.scm-date', 0); + }); + }); + }) + + .run(function () { + test.done(); + }); }); diff --git a/server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-spec/coverage.json b/server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-spec/coverage.json new file mode 100644 index 00000000000..ace41da645e --- /dev/null +++ b/server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-spec/coverage.json @@ -0,0 +1,196 @@ +{"coverage": [ + [46, true, 32, null, null], + [47, true, 32, null, null], + [48, true, 32, null, null], + [49, true, 32, null, null], + [52, true, 2, null, null], + [53, true, 2, null, null], + [57, true, 18, null, null], + [58, true, 18, null, null], + [62, true, 13, null, null], + [63, true, 13, null, null], + [67, false, null, null, null], + [68, false, null, null, null], + [73, true, 27, null, null], + [74, true, 27, null, null], + [75, true, 27, null, null], + [76, true, 1, null, null], + [77, true, 1, null, null], + [85, true, 5, null, null], + [86, true, 5, null, null], + [94, true, 10, null, null], + [95, true, 10, null, null], + [103, true, 11, null, null], + [104, true, 11, null, null], + [112, false, null, null, null], + [113, false, null, null, null], + [120, true, 17, null, null], + [121, true, 17, 2, 2], + [122, true, 8, null, null], + [124, true, 13, null, null], + [125, false, null, null, null], + [127, false, null, null, null], + [132, true, 4, null, null], + [133, true, 4, null, null], + [137, true, 3, null, null], + [138, true, 3, null, null], + [142, true, 5, null, null], + [143, true, 5, null, null], + [147, false, null, null, null], + [148, false, null, null, null], + [153, true, 7, null, null], + [154, true, 7, null, null], + [155, false, null, null, null], + [157, false, null, null, null], + [162, true, 3, null, null], + [163, true, 3, null, null], + [167, true, 3, null, null], + [168, true, 3, null, null], + [172, true, 2, null, null], + [173, true, 2, null, null], + [177, false, null, null, null], + [178, false, null, null, null], + [183, true, 6, null, null], + [184, false, null, null, null], + [186, false, null, null, null], + [196, true, 5, null, null], + [197, true, 5, null, null], + [201, true, 2, null, null], + [202, true, 2, null, null], + [206, true, 1, null, null], + [207, true, 1, null, null], + [211, false, null, null, null], + [212, false, null, null, null], + [217, true, 5, null, null], + [218, true, 5, null, null], + [219, true, 5, null, null], + [220, true, 5, null, null], + [221, false, null, null, null], + [222, false, null, null, null], + [231, true, 4, null, null], + [232, true, 4, null, null], + [233, false, null, null, null], + [234, false, null, null, null], + [235, true, 4, null, null], + [236, true, 4, null, null], + [248, true, 4, null, null], + [249, true, 4, null, null], + [250, true, 4, null, null], + [251, true, 4, null, null], + [252, true, 4, null, null], + [253, true, 4, 2, 2], + [254, true, 2, null, null], + [256, true, 4, null, null], + [257, false, null, null, null], + [258, false, null, null, null], + [265, true, 1, null, null], + [266, true, 1, null, null], + [267, true, 1, null, null], + [268, true, 1, null, null], + [269, true, 1, null, null], + [270, true, 1, null, null], + [271, true, 1, 2, 2], + [272, true, 1, null, null], + [274, true, 1, null, null], + [275, false, null, null, null], + [276, false, null, null, null], + [287, true, 4, null, null], + [288, true, 4, null, null], + [289, true, 4, null, null], + [290, true, 4, null, null], + [291, true, 4, 2, 2], + [292, true, 3, null, null], + [294, true, 4, null, null], + [295, false, null, null, null], + [296, false, null, null, null], + [305, true, 1, null, null], + [306, true, 1, null, null], + [307, true, 1, null, null], + [308, true, 1, null, null], + [309, true, 1, null, null], + [310, false, null, null, null], + [311, false, null, null, null], + [316, false, null, null, null], + [324, true, 23, null, null], + [325, true, 23, null, null], + [326, true, 23, null, null], + [327, true, 23, null, null], + [328, true, 23, null, null], + [329, false, null, null, null], + [330, false, null, null, null], + [339, true, 16, null, null], + [340, true, 16, null, null], + [341, true, 16, null, null], + [342, true, 16, null, null], + [343, false, null, null, null], + [344, false, null, null, null], + [349, true, 9, null, null], + [350, true, 9, null, null], + [351, true, 9, null, null], + [355, true, 3, null, null], + [356, true, 3, null, null], + [357, true, 3, null, null], + [361, true, 7, null, null], + [362, true, 7, null, null], + [363, true, 7, null, null], + [366, true, 20, null, null], + [367, true, 20, null, null], + [368, true, 20, null, null], + [371, true, 18, null, null], + [372, true, 18, null, null], + [373, true, 18, null, null], + [376, false, null, null, null], + [377, false, null, 2, 0], + [378, false, null, null, null], + [380, false, null, null, null], + [389, true, 26, null, null], + [390, true, 26, null, null], + [391, true, 26, null, null], + [395, true, 26, null, null], + [403, true, 26, null, null], + [404, true, 26, null, null], + [405, true, 26, null, null], + [406, true, 26, null, null], + [411, true, 25, null, null], + [412, false, null, null, null], + [413, false, null, null, null], + [421, true, 23, null, null], + [422, false, null, null, null], + [423, false, null, null, null], + [424, true, 23, null, null], + [425, true, 23, 2, 1], + [426, true, 23, null, null], + [428, false, null, null, null], + [433, false, null, null, null], + [440, true, 10, null, null], + [441, true, 10, null, null], + [442, true, 10, null, null], + [446, true, 10, null, null], + [454, true, 10, null, null], + [455, true, 10, null, null], + [456, true, 10, null, null], + [457, true, 10, null, null], + [462, true, 10, null, null], + [463, false, null, null, null], + [464, false, null, null, null], + [472, true, 9, null, null], + [473, false, null, null, null], + [474, false, null, null, null], + [475, true, 9, null, null], + [476, true, 9, 2, 1], + [477, true, 9, null, null], + [478, true, 9, null, null], + [479, true, 9, null, null], + [480, true, 9, 2, 2], + [481, true, 9, null, null], + [483, true, 9, null, null], + [485, false, null, null, null], + [490, false, null, null, null], + [498, true, 16, null, null], + [499, true, 16, null, null], + [500, true, 16, null, null], + [501, true, 16, null, null], + [504, true, 14, null, null], + [509, true, 14, null, null], + [514, false, null, null, null] +]} diff --git a/server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-spec/duplications.json b/server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-spec/duplications.json new file mode 100644 index 00000000000..f77e92bef26 --- /dev/null +++ b/server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-spec/duplications.json @@ -0,0 +1,25 @@ +{"duplications": [ + { + "blocks": [ + { + "from": 404, + "size": 15, + "_ref": "1" + }, + { + "from": 455, + "size": 15, + "_ref": "1" + } + ] + } +], "files": { + "1": { + "key": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java", + "name": "src/main/java/org/sonar/batch/index/Cache.java", + "project": "org.codehaus.sonar:sonar", + "projectName": "SonarQube", + "subProject": "org.codehaus.sonar:sonar-batch", + "subProjectName": "SonarQube :: Batch" + } +}} diff --git a/server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-spec/issues.json b/server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-spec/issues.json new file mode 100644 index 00000000000..0d9c4fbae43 --- /dev/null +++ b/server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-spec/issues.json @@ -0,0 +1,646 @@ +{"maxResultsReached": false, "paging": { + "pageIndex": 1, + "pageSize": 999999, + "total": 27, + "fTotal": "27", + "pages": 1 +}, "issues": [ + { + "key": "1c88fb97-4e89-4719-895d-fdf027cd9e6d", + "component": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java", + "componentId": 19983, + "project": "org.codehaus.sonar:sonar", + "rule": "checkstyle:com.puppycrawl.tools.checkstyle.checks.TodoCommentCheck_1296413157", + "status": "CLOSED", + "resolution": "REMOVED", + "severity": "INFO", + "message": "Comment matches to-do format 'TODO'.", + "line": 153, + "author": "Simon Brandhof", + "creationDate": "2013-04-17T04:05:53+0200", + "updateDate": "2013-07-26T12:39:46+0200", + "fUpdateAge": "12 months", + "closeDate": "2013-07-26T12:39:46+0200" + }, + { + "key": "242b8049-33f5-4bb3-b9a8-ff86de5698d1", + "component": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java", + "componentId": 19983, + "project": "org.codehaus.sonar:sonar", + "rule": "squid:S1135", + "status": "CLOSED", + "resolution": "REMOVED", + "severity": "INFO", + "message": "Complete the task associated to this TODO comment.", + "line": 151, + "author": "Simon Brandhof", + "creationDate": "2013-07-26T14:28:10+0200", + "updateDate": "2013-08-03T00:02:13+0200", + "fUpdateAge": "11 months", + "closeDate": "2013-08-03T00:02:13+0200" + }, + { + "key": "9942b361-7127-4ee1-950c-bc67cdb21d19", + "component": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java", + "componentId": 19983, + "project": "org.codehaus.sonar:sonar", + "rule": "squid:S1135", + "status": "CLOSED", + "resolution": "REMOVED", + "severity": "INFO", + "message": "Complete the task associated to this TODO comment.", + "line": 151, + "author": "Simon Brandhof", + "creationDate": "2013-08-08T00:00:30+0200", + "updateDate": "2013-08-09T00:24:41+0200", + "fUpdateAge": "11 months", + "closeDate": "2013-08-09T00:24:41+0200" + }, + { + "key": "987a803e-2dc8-4552-a0ec-e59c7d6bba8e", + "component": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java", + "componentId": 19983, + "project": "org.codehaus.sonar:sonar", + "rule": "squid:S1166", + "status": "CLOSED", + "resolution": "REMOVED", + "severity": "CRITICAL", + "message": "", + "line": 322, + "author": "Simon Brandhof", + "creationDate": "2013-08-09T16:04:33+0200", + "updateDate": "2013-08-09T17:35:26+0200", + "fUpdateAge": "11 months", + "closeDate": "2013-08-09T17:35:26+0200" + }, + { + "key": "9afae6b5-3328-4867-8263-16ac58589699", + "component": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java", + "componentId": 19983, + "project": "org.codehaus.sonar:sonar", + "rule": "squid:S1173", + "status": "CLOSED", + "resolution": "REMOVED", + "severity": "MAJOR", + "message": "Rename 'it' to a meaningful name of at least 3 characters.", + "line": 297, + "author": "Simon Brandhof", + "creationDate": "2013-08-09T16:04:33+0200", + "updateDate": "2013-08-09T17:35:26+0200", + "fUpdateAge": "11 months", + "closeDate": "2013-08-09T17:35:26+0200" + }, + { + "key": "cb76411f-7965-4949-bfb8-a7e48b19de1c", + "component": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java", + "componentId": 19983, + "project": "org.codehaus.sonar:sonar", + "rule": "squid:S1166", + "status": "CLOSED", + "resolution": "REMOVED", + "severity": "CRITICAL", + "message": "", + "line": 277, + "author": "Simon Brandhof", + "creationDate": "2013-08-09T16:04:33+0200", + "updateDate": "2013-08-09T17:35:26+0200", + "fUpdateAge": "11 months", + "closeDate": "2013-08-09T17:35:26+0200" + }, + { + "key": "e4de6481-7bfb-460a-8b3c-24459f9561d3", + "component": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java", + "componentId": 19983, + "project": "org.codehaus.sonar:sonar", + "rule": "squid:S1135", + "status": "CONFIRMED", + "severity": "INFO", + "message": "Complete the task associated to this TODO comment.", + "line": 240, + "debt": "20min", + "author": "Simon Brandhof", + "creationDate": "2013-08-09T16:04:33+0200", + "updateDate": "2013-08-20T11:32:56+0200", + "fUpdateAge": "11 months" + }, + { + "key": "3a64321a-c031-43ff-bdd6-121cefaf332c", + "component": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java", + "componentId": 19983, + "project": "org.codehaus.sonar:sonar", + "rule": "squid:S1186", + "status": "CLOSED", + "resolution": "FIXED", + "severity": "MAJOR", + "message": "Add a nested comment explaining why this method is empty, throw an UnsupportedOperationException or complete the implementation.", + "line": 406, + "debt": "5min", + "author": "Simon Brandhof", + "actionPlan": "eaf2a3b4-e06f-4e8a-92ec-444f1cf68231", + "creationDate": "2013-08-22T10:19:41+0200", + "updateDate": "2014-02-24T14:51:05+0100", + "fUpdateAge": "4 months", + "closeDate": "2014-02-24T14:51:05+0100" + }, + { + "key": "3c330410-3fb7-474b-a6f3-522fb5468c69", + "component": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java", + "componentId": 19983, + "project": "org.codehaus.sonar:sonar", + "rule": "squid:S1166", + "status": "CLOSED", + "resolution": "FIXED", + "severity": "MAJOR", + "message": "Either log or rethrow this exception along with some contextual information.", + "line": 277, + "assignee": "simon.brandhof", + "author": "Simon Brandhof", + "creationDate": "2013-08-22T10:19:41+0200", + "updateDate": "2013-08-28T12:19:16+0200", + "fUpdateAge": "10 months", + "closeDate": "2013-08-28T12:19:16+0200" + }, + { + "key": "517b0861-bdfd-4b01-a4fc-2fccbf4e1748", + "component": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java", + "componentId": 19983, + "project": "org.codehaus.sonar:sonar", + "rule": "squid:S1192", + "status": "CLOSED", + "resolution": "FIXED", + "severity": "MINOR", + "message": "Define a constant instead of duplicating this literal \"Fail to get element from cache \" 2 times.", + "line": 124, + "debt": "10min", + "author": "Simon Brandhof", + "creationDate": "2013-08-22T10:19:41+0200", + "updateDate": "2014-04-29T11:24:53+0200", + "fUpdateAge": "2 months", + "closeDate": "2014-04-29T11:24:53+0200", + "comments": [ + { + "key": "7b24f4be-bcaa-4896-a5f7-9e1c84648025", + "login": "simon.brandhof", + "userName": "Simon Brandhof", + "htmlText": "Using constants in log messages does not make sense", + "markdown": "Using constants in log messages does not make sense", + "updatable": false, + "createdAt": "2013-09-02T17:04:47+0200" + } + ] + }, + { + "key": "963c67be-0a42-4fe6-837b-755232e4c41b", + "component": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java", + "componentId": 19983, + "project": "org.codehaus.sonar:sonar", + "rule": "squid:S1192", + "status": "CLOSED", + "resolution": "FIXED", + "severity": "MINOR", + "message": "Define a constant instead of duplicating this literal \"Fail to get values from cache \" 3 times.", + "line": 306, + "debt": "10min", + "author": "Simon Brandhof", + "creationDate": "2013-08-22T10:19:41+0200", + "updateDate": "2014-04-29T11:24:53+0200", + "fUpdateAge": "2 months", + "closeDate": "2014-04-29T11:24:53+0200", + "comments": [ + { + "key": "948f7629-4f81-4b5b-8a44-ba9ca05553c4", + "login": "simon.brandhof", + "userName": "Simon Brandhof", + "htmlText": "Using constants in log messages does not make sense", + "markdown": "Using constants in log messages does not make sense", + "updatable": false, + "createdAt": "2013-09-02T17:04:56+0200" + } + ] + }, + { + "key": "bb6cee43-0e33-41a8-b550-6214418b50c1", + "component": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java", + "componentId": 19983, + "project": "org.codehaus.sonar:sonar", + "rule": "squid:S1186", + "status": "CLOSED", + "resolution": "FIXED", + "severity": "MAJOR", + "message": "Add a nested comment explaining why this method is empty, throw an UnsupportedOperationException or complete the implementation.", + "line": 351, + "debt": "20min", + "author": "Simon Brandhof", + "actionPlan": "c3484f53-4bcf-4ae8-ad34-383480070950", + "creationDate": "2013-08-22T10:19:41+0200", + "updateDate": "2013-12-10T15:55:46+0100", + "fUpdateAge": "7 months", + "closeDate": "2013-12-10T15:55:46+0100" + }, + { + "key": "c86f19ef-cacb-43ab-bc7f-a3bfb00e954b", + "component": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java", + "componentId": 19983, + "project": "org.codehaus.sonar:sonar", + "rule": "squid:S1166", + "status": "CLOSED", + "resolution": "FIXED", + "severity": "MAJOR", + "message": "Either log or rethrow this exception along with some contextual information.", + "line": 322, + "assignee": "simon.brandhof", + "author": "Simon Brandhof", + "creationDate": "2013-08-22T10:19:41+0200", + "updateDate": "2013-08-28T12:19:16+0200", + "fUpdateAge": "10 months", + "closeDate": "2013-08-28T12:19:16+0200" + }, + { + "key": "26ebfb62-ce60-47e5-86b9-872d8322ddb8", + "component": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java", + "componentId": 19983, + "project": "org.codehaus.sonar:sonar", + "rule": "findbugs:NP_NULL_PARAM_DEREF", + "status": "CLOSED", + "resolution": "FIXED", + "severity": "CRITICAL", + "message": "Null passed for nonnull parameter of new Cache$Entry(String, String, Serializable) in org.sonar.batch.index.Cache$EntryIterator.next()", + "line": 334, + "author": "Simon Brandhof", + "creationDate": "2013-09-16T17:20:55+0200", + "updateDate": "2013-09-17T01:55:28+0200", + "fUpdateAge": "10 months", + "closeDate": "2013-09-17T01:55:28+0200" + }, + { + "key": "01461208-6c1e-4cdf-9f27-b7afa78e76ec", + "component": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java", + "componentId": 19983, + "project": "org.codehaus.sonar:sonar", + "rule": "squid:S1135", + "status": "CONFIRMED", + "severity": "INFO", + "message": "Complete the task associated to this TODO comment.", + "line": 185, + "debt": "20min", + "author": "simon.brandhof@gmail.com", + "creationDate": "2013-10-10T23:51:33+0200", + "updateDate": "2013-12-10T16:22:53+0100", + "fUpdateAge": "7 months" + }, + { + "key": "71a26f48-a90d-4a76-a745-4f6e6e8b1773", + "component": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java", + "componentId": 19983, + "project": "org.codehaus.sonar:sonar", + "rule": "squid:S1135", + "status": "CONFIRMED", + "severity": "INFO", + "message": "Complete the task associated to this TODO comment.", + "line": 126, + "debt": "20min", + "author": "simon.brandhof@gmail.com", + "creationDate": "2013-10-10T23:51:33+0200", + "updateDate": "2013-12-10T16:24:57+0100", + "fUpdateAge": "7 months" + }, + { + "key": "75419c88-0e3c-4311-aa47-fe5731e67558", + "component": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java", + "componentId": 19983, + "project": "org.codehaus.sonar:sonar", + "rule": "squid:S1135", + "status": "CONFIRMED", + "severity": "INFO", + "message": "Complete the task associated to this TODO comment.", + "line": 156, + "debt": "20min", + "author": "simon.brandhof@gmail.com", + "creationDate": "2013-10-10T23:51:33+0200", + "updateDate": "2013-12-10T16:25:06+0100", + "fUpdateAge": "7 months" + }, + { + "key": "59fc17f7-c977-4cb6-8f04-fbe88e4b9186", + "component": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java", + "componentId": 19983, + "project": "org.codehaus.sonar:sonar", + "rule": "squid:S1192", + "status": "CONFIRMED", + "severity": "MINOR", + "message": "Define a constant instead of duplicating this literal \"Fail to get keys from cache \" 3 times.", + "line": 258, + "debt": "10min", + "author": "simon.brandhof@gmail.com", + "creationDate": "2014-02-20T07:48:16+0100", + "updateDate": "2014-02-24T16:57:34+0100", + "fUpdateAge": "4 months" + }, + { + "key": "e30c874a-0cd1-44db-8dd3-c7cfd5d72929", + "component": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java", + "componentId": 19983, + "project": "org.codehaus.sonar:sonar", + "rule": "squid:S1192", + "status": "CLOSED", + "resolution": "FIXED", + "severity": "MINOR", + "message": "Define a constant instead of duplicating this literal \"Removing an item is not supported\" 2 times.", + "line": 420, + "debt": "10min", + "author": "simon.brandhof@gmail.com", + "creationDate": "2014-02-24T14:51:05+0100", + "updateDate": "2014-04-29T11:24:53+0200", + "fUpdateAge": "2 months", + "closeDate": "2014-04-29T11:24:53+0200" + }, + { + "key": "7cc2e50d-3afc-4e7e-a562-eae2fbb9b596", + "component": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java", + "componentId": 19983, + "project": "org.codehaus.sonar:sonar", + "rule": "squid:S1192", + "status": "CLOSED", + "resolution": "FIXED", + "severity": "MINOR", + "message": "Define a constant instead of duplicating this literal \"Fail to get values from cache \" 3 times.", + "line": 311, + "debt": "10min", + "assignee": "julien.henry", + "author": "julien.henry@sonarsource.com", + "actionPlan": "39d06f0c-98c0-4a4f-956b-38ccbc9eb5c9", + "creationDate": "2014-04-30T23:37:32+0200", + "updateDate": "2014-06-20T14:47:17+0200", + "fUpdateAge": "about a month", + "closeDate": "2014-06-20T14:47:17+0200" + }, + { + "key": "20002ec7-b647-44da-bdf5-4d9fbf4b7c58", + "component": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java", + "componentId": 19983, + "project": "org.codehaus.sonar:sonar", + "rule": "common-java:DuplicatedBlocks", + "status": "CONFIRMED", + "severity": "MAJOR", + "message": "2 duplicated blocks of code.", + "debt": "2h", + "creationDate": "2014-05-01T23:38:31+0200", + "updateDate": "2014-07-01T17:48:47+0200", + "fUpdateAge": "21 days" + }, + { + "key": "5cbf3374-cd56-4e16-8434-d47ee541b347", + "component": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java", + "componentId": 19983, + "project": "org.codehaus.sonar:sonar", + "rule": "squid:HiddenFieldCheck", + "status": "CLOSED", + "resolution": "FIXED", + "severity": "MAJOR", + "message": "Rename \"exchange\" which hides the field declared at line 46.", + "line": 517, + "debt": "30min", + "creationDate": "2014-05-06T16:36:28+0200", + "updateDate": "2014-05-07T23:40:25+0200", + "fUpdateAge": "2 months", + "closeDate": "2014-05-07T23:40:25+0200" + }, + { + "key": "aac25f93-f7e5-4e75-a750-b64d4d621c67", + "component": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java", + "componentId": 19983, + "project": "org.codehaus.sonar:sonar", + "rule": "squid:S1166", + "status": "CLOSED", + "resolution": "FIXED", + "severity": "CRITICAL", + "message": "Either log or rethrow this exception.", + "line": 523, + "debt": "10min", + "creationDate": "2014-05-06T16:36:28+0200", + "updateDate": "2014-05-07T23:40:25+0200", + "fUpdateAge": "2 months", + "closeDate": "2014-05-07T23:40:25+0200" + }, + { + "key": "cdea44e2-a1eb-43dd-a990-662c7cf0b8b9", + "component": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java", + "componentId": 19983, + "project": "org.codehaus.sonar:sonar", + "rule": "findbugs:REC_CATCH_EXCEPTION", + "status": "CLOSED", + "resolution": "FIXED", + "severity": "MAJOR", + "message": "Exception is caught when Exception is not thrown in org.sonar.batch.index.Cache.newExchange(Exchange)", + "line": 523, + "debt": "1h", + "creationDate": "2014-05-06T16:36:28+0200", + "updateDate": "2014-05-07T23:40:25+0200", + "fUpdateAge": "2 months", + "closeDate": "2014-05-07T23:40:25+0200" + }, + { + "key": "331984f1-e2ce-49a7-838f-a5e2e00bdb65", + "component": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java", + "componentId": 19983, + "project": "org.codehaus.sonar:sonar", + "rule": "squid:S1701", + "status": "CLOSED", + "resolution": "REMOVED", + "severity": "MAJOR", + "message": "Rename the \"value\" member.", + "line": 496, + "debt": "10min", + "author": "simon.brandhof@gmail.com", + "creationDate": "2014-06-26T23:17:10+0200", + "updateDate": "2014-06-27T23:12:06+0200", + "fUpdateAge": "25 days", + "closeDate": "2014-06-27T23:12:06+0200" + }, + { + "key": "539895b5-bca6-491a-94da-24b0105af28f", + "component": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java", + "componentId": 19983, + "project": "org.codehaus.sonar:sonar", + "rule": "squid:S1701", + "status": "CLOSED", + "resolution": "REMOVED", + "severity": "MAJOR", + "message": "Rename the \"key\" member.", + "line": 495, + "debt": "10min", + "author": "simon.brandhof@gmail.com", + "creationDate": "2014-06-26T23:17:10+0200", + "updateDate": "2014-06-27T23:12:06+0200", + "fUpdateAge": "25 days", + "closeDate": "2014-06-27T23:12:06+0200" + }, + { + "key": "889efbf0-b218-4be7-9ff4-84867b5bc808", + "component": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java", + "componentId": 19983, + "project": "org.codehaus.sonar:sonar", + "rule": "squid:S1701", + "status": "CLOSED", + "resolution": "REMOVED", + "severity": "MAJOR", + "message": "Rename the \"iterator\" member.", + "line": 387, + "debt": "10min", + "author": "simon.brandhof@gmail.com", + "creationDate": "2014-06-26T23:17:10+0200", + "updateDate": "2014-06-27T23:12:06+0200", + "fUpdateAge": "25 days", + "closeDate": "2014-06-27T23:12:06+0200" + } +], "components": [ + { + "key": "org.codehaus.sonar:sonar", + "id": 2865, + "qualifier": "TRK", + "name": "SonarQube", + "longName": "SonarQube" + }, + { + "key": "org.codehaus.sonar:sonar-batch", + "id": 1624, + "qualifier": "BRC", + "name": "SonarQube :: Batch", + "longName": "SonarQube :: Batch", + "path": "sonar-batch", + "projectId": 2865, + "subProjectId": 2865 + }, + { + "key": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java", + "id": 19983, + "qualifier": "FIL", + "name": "Cache.java", + "longName": "src/main/java/org/sonar/batch/index/Cache.java", + "path": "src/main/java/org/sonar/batch/index/Cache.java", + "projectId": 2865, + "subProjectId": 1624 + } +], "projects": [ + { + "key": "org.codehaus.sonar:sonar", + "id": 2865, + "qualifier": "TRK", + "name": "SonarQube", + "longName": "SonarQube" + } +], "rules": [ + { + "key": "squid:S1166", + "name": "Exception handlers should preserve the original exception", + "desc": "

\nWhen handling a caught exception, two mandatory informations should be logged:\n

\n\n\n\n

Noncompliant Code Example

\n\n
\n // Noncompliant - exception is lost\ntry { /* ... */ } catch (Exception e) { LOGGER.info(\"context\"); }\n\n// Noncompliant - context is required\ntry { /* ... */ } catch (Exception e) { LOGGER.info(e); }\n\n// Noncompliant - exception is lost (only message is preserved)\ntry { /* ... */ } catch (Exception e) { LOGGER.info(e.getMessage()); }\n\n// Noncompliant - exception is lost\ntry { /* ... */ } catch (Exception e) { throw new RuntimeException(\"context\"); }\n
\n\n

Compliant Solution

\n\n
\ntry { /* ... */ } catch (Exception e) { LOGGER.info(\"context\", e); }\n\ntry { /* ... */ } catch (Exception e) { throw new RuntimeException(\"context\", e); }\n
\n\n

Exceptions

\n\n

It is allowed to let the exception propagate.

\n\n
\ntry {\n  /* ... */\n} catch (RuntimeException e) {\n  doSomething();\n  throw e;\n} catch (Exception e) {\n  // Conversion into unchecked exception is also allowed\n  throw new RuntimeException(e);\n}\n
\n\n

\nInterruptedException, NumberFormatException, ParseException and MalformedURLException exceptions are arguably used to indicate nonexceptional outcomes.\nAs they are part of Java, developers have no choice but to deal with them. This rule does not verify that those particular exceptions are correctly handled.\n

\n\n
\nint myInteger;\ntry {\n  myInteger = Integer.parseInt(myString);\n} catch (NumberFormatException e) {\n  // It is perfectly acceptable to not handle \"e\" here\n  myInteger = 0;\n}\n
", + "status": "READY" + }, + { + "key": "common-java:DuplicatedBlocks", + "name": "Duplicated blocks", + "desc": "

An issue is created on a file as soon as there is a block of duplicated code on this file. It gives the number of blocks in the file.

", + "status": "READY" + }, + { + "key": "findbugs:REC_CATCH_EXCEPTION", + "name": "Dodgy - Exception is caught when Exception is not thrown", + "desc": "

\n This method uses a try-catch block that catches Exception objects, but Exception is not\n thrown within the try block, and RuntimeException is not explicitly caught. It is a common bug pattern to\n say try { ... } catch (Exception e) { something } as a shorthand for catching a number of types of exception\n each of whose catch blocks is identical, but this construct also accidentally catches RuntimeException as well,\n masking potential bugs.\n

", + "status": "READY" + }, + { + "key": "squid:S1701", + "name": "Fields should not duplicate method names", + "desc": "

It's confusing to have a class member with the same name as a method in the class.

\n\n

Typically this situation indicates that the method is poorly named; method names should be action-oriented, and thus contain a verb, which is unlikely in the case where both a method and a member have the same name. However, renaming a public method could be disruptive to callers. Therefore renaming the member is the recommended action.

\n\n

Noncompliant Code Sample

\n
\npublic class Foo {\n\n  private string fiz;\n  public String fiz() {\n    // do something...\n  }\n\n  private void doSomething() {\n\n    String tmp = fiz; // is this what was intended? Should this have been a call to fiz()?\n\n  }\n}\n
\n\n

Compliant Solution

\n
\npublic class Foo {\n\n  private string fizbah; // member has been renamed\n  public String fiz() {\n    // do something...\n  }\n\n  private void doSomething() {\n\n    String tmp = fiz; // results in a compile error\n    String tmp2 = fiz(); // no question now what was intended\n  }\n}\n
", + "status": "REMOVED" + }, + { + "key": "squid:S1192", + "name": "String literals should not be duplicated", + "desc": "

\n Duplicated string literals make the process of refactoring error-prone, since you must be sure to update all occurrences.\n On the other hand, constants can be referenced from many places, but only need to be updated in a single place.\n

\n\n

Non Compliant Code Example

\n\n
\npublic void run() {\n  prepare(\"action1\");                              // Non-Compliant - \"action1\" is duplicated 3 times\n  execute(\"action1\");\n  release(\"action1\");\n}\n\n@SuppressWarning(\"all\")                            // Compliant - annotations are excluded\nprivate void method1() { /* ... */ }\n@SuppressWarning(\"all\")\nprivate void method2() { /* ... */ }\n\npublic String method3(String a) {\n  System.out.println(\"'\" + a + \"'\");               // Compliant - literal \"'\" has less than 5 characters and is excluded\n  return \"\";                                       // Compliant - literal \"\" has less than 5 characters and is excluded\n}\n
\n\n

Compliant Code Example

\n\n
\nprivate static final String ACTION_1 = \"action1\";  // Compliant\n\npublic void run() {\n  prepare(ACTION_1);                               // Compliant\n  execute(ACTION_1);\n  release(ACTION_1);\n}\n
\n\n

Exceptions

\n

To prevent generating some false-positives, literals having less than 5 characters are excluded.

", + "status": "READY" + }, + { + "key": "squid:HiddenFieldCheck", + "name": "Local variables should not shadow class fields", + "desc": "

\nShadowing fields with a local variable is a bad practice reducing code readability: It makes it confusing to know whether the field or the variable is and should be accessed.\n

\n\n

\nThe following code illustrates this rule:\n

\n\n
\nclass Foo {\n  public int myField;\n\n  public Foo(int myField) {                   // Compliant - method parameters are not checked\n    this.myField = myField;\n  }\n\n  @Override\n  public String toString() {\n    int myField = 0;                          // Non-Compliant - should be renamed\n    return \"Foo{MyField: \" + myField + \"}\";\n  }\n}\n
", + "status": "READY" + }, + { + "key": "squid:S1135", + "name": "TODO tags should be handled", + "desc": "

\nTODO tags are commonly used to mark places where some more code is required, but which the developer wants to implement later.\nSometimes the developer will not have the time or will simply forget to get back to that tag.\nThis rule is meant to track those tags, and ensure that they do not go unnoticed.\n

\n\n

The following code illustrates this rule:

\n\n
\nvoid doSomething() {\n  // TODO\n}\n
", + "status": "READY" + }, + { + "key": "findbugs:NP_NULL_PARAM_DEREF", + "name": "Correctness - Method call passes null for nonnull parameter", + "desc": "

\n This method call passes a null value for a nonnull method parameter.\n\tEither the parameter is annotated as a parameter that should\n\talways be nonnull, or analysis has shown that it will always be \n\tdereferenced.\n

", + "status": "READY" + }, + { + "key": "squid:S1173", + "name": "S1173", + "desc": "S1173", + "status": "REMOVED" + }, + { + "key": "squid:S1186", + "name": "Methods should not be empty", + "desc": "

There are three reasons for a method not to have a method body:

\n\n\n\n

The following code snippet:

\n\n
\n// Non-Compliant\npublic void doSomething() {\n}\n
\n\nshould be refactored into:\n\n
\n// Compliant\n@Override\npublic void doSomethingElse() {\n  // Do nothing because of X and Y.\n}\n
\n\nor:\n\n
\n// Compliant\n@Override\npublic void doSomethingElse() {\n  throw new UnsupportedOperationException();\n}\n
\n\n

Empty methods not having any nested comments are tolerated in Abstract classes as those empty methods are usual when implementing the visitor pattern.

", + "status": "READY" + } +], "users": [ + { + "login": "julien.henry", + "name": "Julien Henry", + "active": true, + "email": "julien.henry@sonarsource.com" + }, + { + "login": "simon.brandhof", + "name": "Simon Brandhof", + "active": true, + "email": "simon.brandhof@sonarsource.com" + } +], "actionPlans": [ + { + "key": "eaf2a3b4-e06f-4e8a-92ec-444f1cf68231", + "name": "4.2", + "status": "CLOSED", + "project": "org.codehaus.sonar:sonar", + "userLogin": "fabrice.bellingard", + "deadLine": "2014-01-31T00:00:00+0100", + "fDeadLine": "Jan 31, 2014 12:00 AM", + "createdAt": "2013-12-11T08:35:23+0100", + "fCreatedAt": "Dec 11, 2013 8:35 AM", + "updatedAt": "2014-04-14T11:55:03+0200", + "fUpdatedAt": "Apr 14, 2014 11:55 AM" + }, + { + "key": "39d06f0c-98c0-4a4f-956b-38ccbc9eb5c9", + "name": "4.4", + "status": "CLOSED", + "project": "org.codehaus.sonar:sonar", + "userLogin": "fabrice.bellingard", + "deadLine": "2014-06-27T00:00:00+0200", + "fDeadLine": "Jun 27, 2014 12:00 AM", + "createdAt": "2014-04-14T10:23:34+0200", + "fCreatedAt": "Apr 14, 2014 10:23 AM", + "updatedAt": "2014-07-11T16:56:06+0200", + "fUpdatedAt": "Jul 11, 2014 4:56 PM" + }, + { + "key": "c3484f53-4bcf-4ae8-ad34-383480070950", + "name": "SonarQube 4.1", + "status": "CLOSED", + "project": "org.codehaus.sonar:sonar", + "userLogin": "freddy.mallet", + "deadLine": "2013-11-05T00:00:00+0100", + "fDeadLine": "Nov 5, 2013 12:00 AM", + "createdAt": "2013-10-22T12:39:01+0200", + "fCreatedAt": "Oct 22, 2013 12:39 PM", + "updatedAt": "2013-12-12T14:22:07+0100", + "fUpdatedAt": "Dec 12, 2013 2:22 PM" + } +]} diff --git a/server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-spec/scm.json b/server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-spec/scm.json new file mode 100644 index 00000000000..ff89c9856ca --- /dev/null +++ b/server/sonar-web/src/main/js/tests/e2e/tests/component-viewer-spec/scm.json @@ -0,0 +1,184 @@ +{"scm": [ + [1, "simon.brandhof@gmail.com", "2013-04-16"], + [2, "simon.brandhof@gmail.com", "2013-04-21"], + [3, "simon.brandhof@gmail.com", "2014-03-11"], + [4, "simon.brandhof@gmail.com", "2013-04-16"], + [6, "simon.brandhof@gmail.com", "2013-04-21"], + [7, "simon.brandhof@gmail.com", "2013-04-16"], + [11, "simon.brandhof@gmail.com", "2013-04-21"], + [12, "simon.brandhof@gmail.com", "2013-04-16"], + [16, "simon.brandhof@gmail.com", "2013-04-22"], + [19, "simon.brandhof@gmail.com", "2013-04-16"], + [25, "julien.henry@sonarsource.com", "2014-05-01"], + [26, "simon.brandhof@gmail.com", "2013-04-17"], + [30, "julien.henry@sonarsource.com", "2014-04-30"], + [31, "simon.brandhof@gmail.com", "2013-04-16"], + [32, "simon.brandhof@gmail.com", "2013-04-17"], + [33, "julien.henry@sonarsource.com", "2014-05-01"], + [34, "simon.brandhof@gmail.com", "2013-04-16"], + [37, "simon.brandhof@gmail.com", "2013-04-17"], + [38, "simon.brandhof@gmail.com", "2013-04-16"], + [39, "simon.brandhof@gmail.com", "2013-04-17"], + [40, "simon.brandhof@gmail.com", "2013-04-16"], + [41, "simon.brandhof@gmail.com", "2014-02-20"], + [42, "simon.brandhof@gmail.com", "2013-04-16"], + [51, "julien.henry@sonarsource.com", "2014-05-01"], + [52, "simon.brandhof@gmail.com", "2014-02-20"], + [54, "simon.brandhof@gmail.com", "2013-04-16"], + [56, "julien.henry@sonarsource.com", "2014-05-01"], + [57, "simon.brandhof@gmail.com", "2014-02-20"], + [61, "julien.henry@sonarsource.com", "2014-05-01"], + [62, "simon.brandhof@gmail.com", "2014-02-20"], + [66, "julien.henry@sonarsource.com", "2014-05-01"], + [67, "simon.brandhof@gmail.com", "2014-02-20"], + [71, "julien.henry@sonarsource.com", "2014-05-01"], + [72, "simon.brandhof@gmail.com", "2013-04-16"], + [77, "simon.brandhof@gmail.com", "2013-05-29"], + [78, "simon.brandhof@gmail.com", "2013-04-16"], + [82, "simon.brandhof@gmail.com", "2014-02-20"], + [83, "simon.brandhof@gmail.com", "2013-04-16"], + [84, "simon.brandhof@gmail.com", "2014-02-20"], + [116, "julien.henry@sonarsource.com", "2014-05-01"], + [117, "simon.brandhof@gmail.com", "2014-02-20"], + [119, "simon.brandhof@gmail.com", "2013-04-16"], + [126, "simon.brandhof@gmail.com", "2013-10-10"], + [127, "simon.brandhof@gmail.com", "2013-05-29"], + [128, "simon.brandhof@gmail.com", "2013-04-16"], + [131, "simon.brandhof@gmail.com", "2014-02-20"], + [144, "simon.brandhof@gmail.com", "2013-04-16"], + [146, "simon.brandhof@gmail.com", "2014-02-20"], + [152, "simon.brandhof@gmail.com", "2013-10-10"], + [161, "simon.brandhof@gmail.com", "2014-02-20"], + [182, "simon.brandhof@gmail.com", "2013-04-16"], + [183, "simon.brandhof@gmail.com", "2013-04-26"], + [184, "simon.brandhof@gmail.com", "2013-04-16"], + [185, "simon.brandhof@gmail.com", "2013-10-10"], + [186, "simon.brandhof@gmail.com", "2013-05-29"], + [187, "simon.brandhof@gmail.com", "2013-04-16"], + [195, "julien.henry@sonarsource.com", "2014-05-01"], + [196, "simon.brandhof@gmail.com", "2014-02-20"], + [200, "julien.henry@sonarsource.com", "2014-05-01"], + [201, "simon.brandhof@gmail.com", "2014-02-20"], + [205, "julien.henry@sonarsource.com", "2014-05-01"], + [206, "simon.brandhof@gmail.com", "2014-02-20"], + [210, "julien.henry@sonarsource.com", "2014-05-01"], + [211, "simon.brandhof@gmail.com", "2014-02-20"], + [215, "julien.henry@sonarsource.com", "2014-05-01"], + [216, "simon.brandhof@gmail.com", "2013-04-16"], + [217, "simon.brandhof@gmail.com", "2014-02-20"], + [220, "simon.brandhof@gmail.com", "2013-04-16"], + [222, "simon.brandhof@gmail.com", "2014-02-20"], + [223, "simon.brandhof@gmail.com", "2013-04-16"], + [229, "simon.brandhof@gmail.com", "2014-02-20"], + [230, "simon.brandhof@gmail.com", "2013-04-16"], + [245, "julien.henry@sonarsource.com", "2014-05-01"], + [246, "simon.brandhof@gmail.com", "2014-02-20"], + [247, "simon.brandhof@gmail.com", "2013-04-16"], + [248, "simon.brandhof@gmail.com", "2014-02-20"], + [249, "simon.brandhof@gmail.com", "2013-04-16"], + [251, "simon.brandhof@gmail.com", "2014-02-20"], + [252, "simon.brandhof@gmail.com", "2013-04-16"], + [254, "simon.brandhof@gmail.com", "2014-02-20"], + [255, "simon.brandhof@gmail.com", "2013-04-16"], + [258, "simon.brandhof@gmail.com", "2013-05-29"], + [259, "simon.brandhof@gmail.com", "2013-04-16"], + [262, "julien.henry@sonarsource.com", "2014-05-01"], + [263, "simon.brandhof@gmail.com", "2014-02-20"], + [279, "simon.brandhof@gmail.com", "2013-04-16"], + [285, "simon.brandhof@gmail.com", "2014-02-20"], + [298, "simon.brandhof@gmail.com", "2013-04-16"], + [300, "simon.brandhof@gmail.com", "2013-05-29"], + [301, "julien.henry@sonarsource.com", "2014-04-30"], + [308, "julien.henry@sonarsource.com", "2014-05-01"], + [310, "julien.henry@sonarsource.com", "2014-04-30"], + [311, "julien.henry@sonarsource.com", "2014-06-20"], + [312, "julien.henry@sonarsource.com", "2014-04-30"], + [315, "julien.henry@sonarsource.com", "2014-06-20"], + [319, "julien.henry@sonarsource.com", "2014-04-30"], + [320, "simon.brandhof@gmail.com", "2014-02-20"], + [321, "simon.brandhof@gmail.com", "2013-05-29"], + [322, "julien.henry@sonarsource.com", "2014-05-01"], + [323, "simon.brandhof@gmail.com", "2013-04-16"], + [325, "julien.henry@sonarsource.com", "2014-05-01"], + [326, "simon.brandhof@gmail.com", "2013-04-16"], + [327, "julien.henry@sonarsource.com", "2014-05-01"], + [329, "simon.brandhof@gmail.com", "2013-04-16"], + [330, "julien.henry@sonarsource.com", "2014-06-20"], + [331, "simon.brandhof@gmail.com", "2013-04-16"], + [334, "simon.brandhof@gmail.com", "2013-05-29"], + [337, "simon.brandhof@gmail.com", "2013-04-16"], + [339, "simon.brandhof@gmail.com", "2014-02-20"], + [340, "simon.brandhof@gmail.com", "2013-04-16"], + [341, "julien.henry@sonarsource.com", "2014-05-01"], + [343, "simon.brandhof@gmail.com", "2013-04-16"], + [344, "julien.henry@sonarsource.com", "2014-06-20"], + [345, "simon.brandhof@gmail.com", "2013-04-16"], + [347, "simon.brandhof@gmail.com", "2013-04-17"], + [348, "simon.brandhof@gmail.com", "2014-02-20"], + [350, "julien.henry@sonarsource.com", "2014-05-01"], + [352, "simon.brandhof@gmail.com", "2013-04-17"], + [353, "simon.brandhof@gmail.com", "2014-02-20"], + [354, "julien.henry@sonarsource.com", "2014-05-01"], + [358, "simon.brandhof@gmail.com", "2013-04-17"], + [359, "simon.brandhof@gmail.com", "2014-02-20"], + [363, "simon.brandhof@gmail.com", "2013-04-17"], + [365, "simon.brandhof@gmail.com", "2014-02-20"], + [368, "simon.brandhof@gmail.com", "2013-04-17"], + [370, "simon.brandhof@gmail.com", "2014-02-20"], + [380, "simon.brandhof@gmail.com", "2013-04-17"], + [382, "simon.brandhof@gmail.com", "2013-05-29"], + [389, "julien.henry@sonarsource.com", "2014-05-01"], + [391, "simon.brandhof@gmail.com", "2013-05-29"], + [401, "julien.henry@sonarsource.com", "2014-05-01"], + [402, "simon.brandhof@gmail.com", "2013-05-29"], + [403, "julien.henry@sonarsource.com", "2014-05-01"], + [404, "simon.brandhof@gmail.com", "2013-05-29"], + [405, "julien.henry@sonarsource.com", "2014-05-01"], + [406, "simon.brandhof@gmail.com", "2013-05-29"], + [411, "julien.henry@sonarsource.com", "2014-05-01"], + [412, "simon.brandhof@gmail.com", "2013-05-29"], + [417, "julien.henry@sonarsource.com", "2014-05-01"], + [418, "simon.brandhof@gmail.com", "2013-05-29"], + [420, "simon.brandhof@gmail.com", "2014-02-20"], + [421, "julien.henry@sonarsource.com", "2014-05-01"], + [422, "simon.brandhof@gmail.com", "2014-02-20"], + [425, "simon.brandhof@gmail.com", "2013-05-29"], + [426, "julien.henry@sonarsource.com", "2014-05-01"], + [427, "simon.brandhof@gmail.com", "2013-05-29"], + [428, "julien.henry@sonarsource.com", "2014-05-01"], + [429, "simon.brandhof@gmail.com", "2013-05-29"], + [433, "simon.brandhof@gmail.com", "2014-02-24"], + [434, "simon.brandhof@gmail.com", "2013-05-29"], + [437, "simon.brandhof@gmail.com", "2013-04-17"], + [440, "julien.henry@sonarsource.com", "2014-05-01"], + [442, "simon.brandhof@gmail.com", "2013-04-17"], + [452, "julien.henry@sonarsource.com", "2014-05-01"], + [453, "simon.brandhof@gmail.com", "2013-04-17"], + [454, "julien.henry@sonarsource.com", "2014-05-01"], + [455, "simon.brandhof@gmail.com", "2013-04-17"], + [456, "julien.henry@sonarsource.com", "2014-05-01"], + [457, "simon.brandhof@gmail.com", "2013-04-17"], + [462, "julien.henry@sonarsource.com", "2014-05-01"], + [463, "simon.brandhof@gmail.com", "2013-04-17"], + [468, "julien.henry@sonarsource.com", "2014-05-01"], + [469, "simon.brandhof@gmail.com", "2013-04-17"], + [470, "julien.henry@sonarsource.com", "2014-05-01"], + [475, "simon.brandhof@gmail.com", "2013-04-17"], + [476, "julien.henry@sonarsource.com", "2014-05-01"], + [478, "simon.brandhof@gmail.com", "2013-04-17"], + [479, "simon.brandhof@gmail.com", "2014-02-20"], + [483, "julien.henry@sonarsource.com", "2014-05-01"], + [486, "simon.brandhof@gmail.com", "2013-04-17"], + [490, "simon.brandhof@gmail.com", "2014-02-24"], + [491, "simon.brandhof@gmail.com", "2013-04-17"], + [494, "simon.brandhof@gmail.com", "2014-02-20"], + [497, "simon.brandhof@gmail.com", "2013-04-17"], + [498, "simon.brandhof@gmail.com", "2014-02-20"], + [499, "simon.brandhof@gmail.com", "2013-04-17"], + [503, "simon.brandhof@gmail.com", "2014-02-20"], + [504, "simon.brandhof@gmail.com", "2013-04-17"], + [508, "simon.brandhof@gmail.com", "2014-02-20"], + [509, "simon.brandhof@gmail.com", "2013-04-17"], + [517, "julien.henry@sonarsource.com", "2014-05-06"], + [518, "simon.brandhof@gmail.com", "2013-04-16"] +]} -- 2.39.5