logster 2.1.2 → 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (127) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +21 -19
  3. data/.rubocop.yml +1 -1
  4. data/.travis.yml +16 -16
  5. data/CHANGELOG.md +224 -172
  6. data/Gemfile +4 -4
  7. data/Guardfile +8 -8
  8. data/LICENSE.txt +22 -22
  9. data/README.md +99 -99
  10. data/Rakefile +21 -21
  11. data/assets/fonts/FontAwesome.otf +0 -0
  12. data/assets/fonts/fontawesome-webfont.eot +0 -0
  13. data/assets/fonts/fontawesome-webfont.svg +639 -639
  14. data/assets/fonts/fontawesome-webfont.ttf +0 -0
  15. data/assets/fonts/fontawesome-webfont.woff +0 -0
  16. data/assets/fonts/fontawesome-webfont.woff2 +0 -0
  17. data/assets/images/Icon-144_rounded.png +0 -0
  18. data/assets/images/Icon-144_square.png +0 -0
  19. data/assets/images/icon_144x144.png +0 -0
  20. data/assets/images/icon_64x64.png +0 -0
  21. data/assets/javascript/client-app.js +115 -106
  22. data/assets/stylesheets/client-app.css +1 -1
  23. data/build_client_app.sh +0 -0
  24. data/client-app/.editorconfig +20 -20
  25. data/client-app/.ember-cli +9 -9
  26. data/client-app/.eslintignore +19 -19
  27. data/client-app/.eslintrc.js +46 -46
  28. data/client-app/.gitignore +23 -23
  29. data/client-app/.travis.yml +27 -27
  30. data/client-app/.watchmanconfig +3 -3
  31. data/client-app/README.md +57 -57
  32. data/client-app/app/app.js +0 -0
  33. data/client-app/app/components/actions-menu.js +43 -43
  34. data/client-app/app/components/env-tab.js +80 -80
  35. data/client-app/app/components/message-info.js +0 -0
  36. data/client-app/app/components/message-row.js +0 -0
  37. data/client-app/app/components/panel-resizer.js +0 -0
  38. data/client-app/app/components/patterns-list.js +109 -0
  39. data/client-app/app/components/tab-contents.js +27 -27
  40. data/client-app/app/components/tabbed-section.js +0 -0
  41. data/client-app/app/components/time-formatter.js +0 -0
  42. data/client-app/app/components/update-time.js +0 -0
  43. data/client-app/app/controllers/index.js +22 -6
  44. data/client-app/app/controllers/show.js +0 -0
  45. data/client-app/app/helpers/logster-url.js +12 -0
  46. data/client-app/app/helpers/or.js +7 -0
  47. data/client-app/app/index.html +30 -29
  48. data/client-app/app/initializers/app-init.js +67 -67
  49. data/client-app/app/lib/preload.js +20 -20
  50. data/client-app/app/lib/utilities.js +150 -149
  51. data/client-app/app/models/message-collection.js +0 -0
  52. data/client-app/app/models/message.js +100 -100
  53. data/client-app/app/models/pattern-item.js +25 -0
  54. data/client-app/app/resolver.js +0 -0
  55. data/client-app/app/router.js +1 -0
  56. data/client-app/app/routes/index.js +2 -9
  57. data/client-app/app/routes/settings.js +15 -0
  58. data/client-app/app/routes/show.js +0 -0
  59. data/client-app/app/styles/app.css +633 -527
  60. data/client-app/app/templates/application.hbs +2 -2
  61. data/client-app/app/templates/components/actions-menu.hbs +12 -12
  62. data/client-app/app/templates/components/env-tab.hbs +10 -10
  63. data/client-app/app/templates/components/message-info.hbs +41 -41
  64. data/client-app/app/templates/components/message-row.hbs +15 -15
  65. data/client-app/app/templates/components/panel-resizer.hbs +3 -3
  66. data/client-app/app/templates/components/patterns-list.hbs +25 -0
  67. data/client-app/app/templates/components/tabbed-section.hbs +10 -10
  68. data/client-app/app/templates/components/time-formatter.hbs +1 -1
  69. data/client-app/app/templates/index.hbs +65 -58
  70. data/client-app/app/templates/settings.hbs +26 -0
  71. data/client-app/app/templates/show.hbs +7 -7
  72. data/client-app/config/environment.js +51 -51
  73. data/client-app/config/optional-features.json +3 -3
  74. data/client-app/config/targets.js +18 -18
  75. data/client-app/ember-cli-build.js +29 -29
  76. data/client-app/package-lock.json +11357 -11365
  77. data/client-app/package.json +57 -56
  78. data/client-app/public/assets/images/icon_144x144.png +0 -0
  79. data/client-app/public/assets/images/icon_64x64.png +0 -0
  80. data/client-app/testem.js +25 -25
  81. data/client-app/tests/index.html +34 -34
  82. data/client-app/tests/integration/components/env-tab-test.js +134 -123
  83. data/client-app/tests/integration/components/message-info-test.js +111 -111
  84. data/client-app/tests/integration/components/patterns-list-test.js +56 -0
  85. data/client-app/tests/test-helper.js +8 -8
  86. data/client-app/tests/unit/controllers/index-test.js +12 -12
  87. data/client-app/tests/unit/controllers/show-test.js +12 -12
  88. data/client-app/tests/unit/initializers/app-init-test.js +31 -31
  89. data/client-app/tests/unit/routes/index-test.js +11 -11
  90. data/client-app/tests/unit/routes/show-test.js +11 -11
  91. data/lib/examples/sidekiq_logster_reporter.rb +21 -21
  92. data/lib/logster.rb +59 -54
  93. data/lib/logster/base_store.rb +169 -141
  94. data/lib/logster/cache.rb +20 -0
  95. data/lib/logster/configuration.rb +27 -26
  96. data/lib/logster/defer_logger.rb +14 -14
  97. data/lib/logster/ignore_pattern.rb +65 -65
  98. data/lib/logster/logger.rb +113 -113
  99. data/lib/logster/message.rb +212 -212
  100. data/lib/logster/middleware/debug_exceptions.rb +26 -26
  101. data/lib/logster/middleware/reporter.rb +55 -55
  102. data/lib/logster/middleware/viewer.rb +297 -222
  103. data/lib/logster/pattern.rb +95 -0
  104. data/lib/logster/rails/railtie.rb +63 -63
  105. data/lib/logster/redis_store.rb +584 -566
  106. data/lib/logster/scheduler.rb +54 -54
  107. data/lib/logster/suppression_pattern.rb +17 -0
  108. data/lib/logster/version.rb +3 -3
  109. data/lib/logster/web.rb +14 -14
  110. data/logster.gemspec +35 -35
  111. data/test/examples/test_sidekiq_reporter_example.rb +46 -46
  112. data/test/fake_data/Gemfile +4 -4
  113. data/test/fake_data/generate.rb +10 -10
  114. data/test/logster/middleware/test_reporter.rb +19 -19
  115. data/test/logster/middleware/test_viewer.rb +267 -96
  116. data/test/logster/test_base_store.rb +147 -147
  117. data/test/logster/test_cache.rb +38 -0
  118. data/test/logster/test_defer_logger.rb +34 -34
  119. data/test/logster/test_ignore_pattern.rb +41 -41
  120. data/test/logster/test_logger.rb +100 -86
  121. data/test/logster/test_message.rb +119 -119
  122. data/test/logster/test_pattern.rb +152 -0
  123. data/test/logster/test_redis_rate_limiter.rb +230 -230
  124. data/test/logster/test_redis_store.rb +689 -720
  125. data/test/test_helper.rb +38 -38
  126. data/vendor/assets/javascripts/logster.js.erb +39 -39
  127. metadata +24 -7
@@ -1,56 +1,57 @@
1
- {
2
- "name": "client-app",
3
- "version": "0.0.0",
4
- "private": true,
5
- "description": "Logging framework and viewer",
6
- "repository": "https://github.com/discourse/logster/",
7
- "license": "MIT",
8
- "author": "Sam Saffron",
9
- "directories": {
10
- "doc": "doc",
11
- "test": "tests"
12
- },
13
- "scripts": {
14
- "build": "ember build",
15
- "lint:hbs": "ember-template-lint .",
16
- "lint:js": "eslint .",
17
- "start": "ember serve",
18
- "test": "ember test"
19
- },
20
- "devDependencies": {
21
- "@ember/jquery": "^0.5.2",
22
- "@ember/optional-features": "^0.6.3",
23
- "broccoli-asset-rev": "^2.7.0",
24
- "ember-ajax": "^3.1.0",
25
- "ember-cli": "~3.5.0",
26
- "ember-cli-app-version": "^3.2.0",
27
- "ember-cli-babel": "^6.16.0",
28
- "ember-cli-dependency-checker": "^3.0.0",
29
- "ember-cli-eslint": "^4.2.3",
30
- "ember-cli-htmlbars": "^3.0.0",
31
- "ember-cli-htmlbars-inline-precompile": "^1.0.3",
32
- "ember-cli-inject-live-reload": "^1.8.2",
33
- "ember-cli-sri": "^2.1.1",
34
- "ember-cli-template-lint": "^1.0.0-beta.1",
35
- "ember-cli-uglify": "^2.1.0",
36
- "ember-data": "~3.5.0",
37
- "ember-export-application-global": "^2.0.0",
38
- "ember-font-awesome": "^4.0.0-rc.4",
39
- "ember-load-initializers": "^1.1.0",
40
- "ember-maybe-import-regenerator": "^0.1.6",
41
- "ember-qunit": "^3.4.1",
42
- "ember-resolver": "^5.0.1",
43
- "ember-source": "~3.5.0",
44
- "ember-welcome-page": "^3.2.0",
45
- "eslint-plugin-ember": "^5.2.0",
46
- "loader.js": "^4.7.0",
47
- "qunit-dom": "^0.8.0"
48
- },
49
- "engines": {
50
- "node": "6.* || 8.* || >= 10.*"
51
- },
52
- "dependencies": {
53
- "lodash": "~4.17.11",
54
- "moment": "~2.22.2"
55
- }
56
- }
1
+ {
2
+ "name": "client-app",
3
+ "version": "0.0.0",
4
+ "private": true,
5
+ "description": "Logging framework and viewer",
6
+ "repository": "https://github.com/discourse/logster/",
7
+ "license": "MIT",
8
+ "author": "Sam Saffron",
9
+ "directories": {
10
+ "doc": "doc",
11
+ "test": "tests"
12
+ },
13
+ "scripts": {
14
+ "build": "ember build",
15
+ "lint:hbs": "ember-template-lint .",
16
+ "lint:js": "eslint .",
17
+ "start": "ember serve",
18
+ "test": "ember test"
19
+ },
20
+ "devDependencies": {
21
+ "@ember/jquery": "^0.5.2",
22
+ "@ember/optional-features": "^0.6.3",
23
+ "broccoli-asset-rev": "^2.7.0",
24
+ "ember-ajax": "^3.1.0",
25
+ "ember-cli": "~3.5.0",
26
+ "ember-cli-app-version": "^3.2.0",
27
+ "ember-cli-babel": "^6.16.0",
28
+ "ember-cli-dependency-checker": "^3.0.0",
29
+ "ember-cli-eslint": "^4.2.3",
30
+ "ember-cli-htmlbars": "^3.0.0",
31
+ "ember-cli-htmlbars-inline-precompile": "^1.0.3",
32
+ "ember-cli-inject-live-reload": "^1.8.2",
33
+ "ember-cli-sri": "^2.1.1",
34
+ "ember-cli-template-lint": "^1.0.0-beta.1",
35
+ "ember-cli-uglify": "^2.1.0",
36
+ "ember-data": "~3.5.0",
37
+ "ember-export-application-global": "^2.0.0",
38
+ "ember-font-awesome": "^4.0.0-rc.4",
39
+ "ember-load-initializers": "^1.1.0",
40
+ "ember-maybe-import-regenerator": "^0.1.6",
41
+ "ember-qunit": "^3.4.1",
42
+ "ember-resolver": "^5.0.1",
43
+ "ember-source": "~3.5.0",
44
+ "ember-welcome-page": "^3.2.0",
45
+ "eslint-plugin-ember": "^5.2.0",
46
+ "loader.js": "^4.7.0",
47
+ "prettier": "^1.16.4",
48
+ "qunit-dom": "^0.8.0"
49
+ },
50
+ "engines": {
51
+ "node": "6.* || 8.* || >= 10.*"
52
+ },
53
+ "dependencies": {
54
+ "lodash": "~4.17.11",
55
+ "moment": "~2.22.2"
56
+ }
57
+ }
@@ -1,25 +1,25 @@
1
- module.exports = {
2
- test_page: 'tests/index.html?hidepassed',
3
- disable_watching: true,
4
- launch_in_ci: [
5
- 'Chrome'
6
- ],
7
- launch_in_dev: [
8
- 'Chrome'
9
- ],
10
- browser_args: {
11
- Chrome: {
12
- ci: [
13
- // --no-sandbox is needed when running Chrome inside a container
14
- process.env.CI ? '--no-sandbox' : null,
15
- '--headless',
16
- '--disable-gpu',
17
- '--disable-dev-shm-usage',
18
- '--disable-software-rasterizer',
19
- '--mute-audio',
20
- '--remote-debugging-port=0',
21
- '--window-size=1440,900'
22
- ].filter(Boolean)
23
- }
24
- }
25
- };
1
+ module.exports = {
2
+ test_page: 'tests/index.html?hidepassed',
3
+ disable_watching: true,
4
+ launch_in_ci: [
5
+ 'Chrome'
6
+ ],
7
+ launch_in_dev: [
8
+ 'Chrome'
9
+ ],
10
+ browser_args: {
11
+ Chrome: {
12
+ ci: [
13
+ // --no-sandbox is needed when running Chrome inside a container
14
+ process.env.CI ? '--no-sandbox' : null,
15
+ '--headless',
16
+ '--disable-gpu',
17
+ '--disable-dev-shm-usage',
18
+ '--disable-software-rasterizer',
19
+ '--mute-audio',
20
+ '--remote-debugging-port=0',
21
+ '--window-size=1440,900'
22
+ ].filter(Boolean)
23
+ }
24
+ }
25
+ };
@@ -1,34 +1,34 @@
1
- <!DOCTYPE html>
2
- <html>
3
- <head>
4
- <meta charset="utf-8">
5
- <meta http-equiv="X-UA-Compatible" content="IE=edge">
6
- <title>ClientApp Tests</title>
7
- <meta name="description" content="">
8
- <meta name="viewport" content="width=device-width, initial-scale=1">
9
- <meta id="preloaded-data" data-root-path="/logs" data-preloaded="{&quot;env_expandable_keys&quot;:[]}">
10
-
11
- {{content-for "head"}}
12
- {{content-for "test-head"}}
13
-
14
- <link rel="stylesheet" href="{{rootURL}}assets/vendor.css">
15
- <link rel="stylesheet" href="{{rootURL}}assets/client-app.css">
16
- <link rel="stylesheet" href="{{rootURL}}assets/test-support.css">
17
-
18
- {{content-for "head-footer"}}
19
- {{content-for "test-head-footer"}}
20
- </head>
21
- <body>
22
- {{content-for "body"}}
23
- {{content-for "test-body"}}
24
-
25
- <script src="/testem.js" integrity=""></script>
26
- <script src="{{rootURL}}assets/vendor.js"></script>
27
- <script src="{{rootURL}}assets/test-support.js"></script>
28
- <script src="{{rootURL}}assets/client-app.js"></script>
29
- <script src="{{rootURL}}assets/tests.js"></script>
30
-
31
- {{content-for "body-footer"}}
32
- {{content-for "test-body-footer"}}
33
- </body>
34
- </html>
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
6
+ <title>ClientApp Tests</title>
7
+ <meta name="description" content="">
8
+ <meta name="viewport" content="width=device-width, initial-scale=1">
9
+ <meta id="preloaded-data" data-root-path="/logs" data-preloaded="{&quot;env_expandable_keys&quot;:[]}">
10
+
11
+ {{content-for "head"}}
12
+ {{content-for "test-head"}}
13
+
14
+ <link rel="stylesheet" href="{{rootURL}}assets/vendor.css">
15
+ <link rel="stylesheet" href="{{rootURL}}assets/client-app.css">
16
+ <link rel="stylesheet" href="{{rootURL}}assets/test-support.css">
17
+
18
+ {{content-for "head-footer"}}
19
+ {{content-for "test-head-footer"}}
20
+ </head>
21
+ <body>
22
+ {{content-for "body"}}
23
+ {{content-for "test-body"}}
24
+
25
+ <script src="/testem.js" integrity=""></script>
26
+ <script src="{{rootURL}}assets/vendor.js"></script>
27
+ <script src="{{rootURL}}assets/test-support.js"></script>
28
+ <script src="{{rootURL}}assets/client-app.js"></script>
29
+ <script src="{{rootURL}}assets/tests.js"></script>
30
+
31
+ {{content-for "body-footer"}}
32
+ {{content-for "test-body-footer"}}
33
+ </body>
34
+ </html>
@@ -1,123 +1,134 @@
1
- import { module, test } from "qunit";
2
- import { setupRenderingTest } from "ember-qunit";
3
- import { render, find, findAll, click } from "@ember/test-helpers";
4
- import hbs from "htmlbars-inline-precompile";
5
- import Message from "client-app/models/message";
6
- import { init } from "client-app/lib/preload";
7
-
8
- const message = Message.create({
9
- env: [{ a: "aa", b: "bb" }, { c: "cc", d: "dd" }]
10
- });
11
-
12
- const message2 = Message.create({
13
- env: { e: "ee", f: "ff" }
14
- });
15
-
16
- const message3 = Message.create({
17
- env: [
18
- { env_key_2: "an_env_value", notExpanded: "dsdcz" },
19
- { env_key_2: "anotherthing", notExpanded: "cxc" }
20
- ]
21
- });
22
-
23
- function reduceToContent(node) {
24
- return Array.from(node.childNodes).reduce(
25
- (ac, cr) => `${ac.textContent}: ${cr.textContent}`
26
- );
27
- }
28
-
29
- module("Integration | Component | env-tab", function(hooks) {
30
- setupRenderingTest(hooks);
31
-
32
- test("it renders", async function(assert) {
33
- this.set("message", message);
34
- await render(hbs`{{env-tab message=message}}`);
35
-
36
- assert.equal(
37
- find(".env-number").textContent,
38
- "1/2",
39
- "shows the current over the total number of env objects"
40
- );
41
- let trs = findAll("tr");
42
- assert.equal(trs.length, 2);
43
- assert.equal(reduceToContent(trs[0]), "a: aa", "has the right content");
44
- assert.equal(reduceToContent(trs[1]), "b: bb", "has the right content");
45
-
46
- const buttons = findAll("button.nav-btn");
47
- // at first page, you can't go back
48
- assert.ok(buttons[0].disabled, "back buttons are disabled");
49
- assert.ok(buttons[1].disabled, "back buttons are disabled");
50
-
51
- assert.notOk(buttons[2].disabled, "forward buttons are not disabled");
52
- assert.notOk(buttons[3].disabled, "forward buttons are not disabled");
53
-
54
- this.set("message", message2);
55
- assert.dom("button").doesNotExist("doesn't show buttons for non-array env");
56
-
57
- trs = findAll("tr");
58
- assert.equal(trs.length, 2);
59
- assert.equal(reduceToContent(trs[0]), "e: ee", "has the right content");
60
- assert.equal(reduceToContent(trs[1]), "f: ff", "has the right content");
61
- });
62
-
63
- test("it works correctly", async function(assert) {
64
- this.set("message", message);
65
- await render(hbs`{{env-tab message=message}}`);
66
-
67
- const buttons = findAll("button.nav-btn");
68
- await click(buttons[2]);
69
-
70
- assert.equal(
71
- find(".env-number").textContent,
72
- "2/2",
73
- "shows the current over the total number of env objects"
74
- );
75
-
76
- const trs = findAll("tr");
77
- assert.equal(trs.length, 2);
78
- assert.equal(reduceToContent(trs[0]), "c: cc", "has the right content");
79
- assert.equal(reduceToContent(trs[1]), "d: dd", "has the right content");
80
-
81
- // at last page, you can't go forward but you can go back
82
- assert.notOk(buttons[0].disabled, "back buttons are not disabled");
83
- assert.notOk(buttons[1].disabled, "back buttons are not disabled");
84
-
85
- assert.ok(buttons[2].disabled, "forward buttons are disabled");
86
- assert.ok(buttons[3].disabled, "forward buttons are disabled");
87
- });
88
-
89
- test("expandable env keys", async function(assert) {
90
- document.getElementById(
91
- "preloaded-data"
92
- ).dataset.preloaded = JSON.stringify({
93
- env_expandable_keys: ["env_key_2"]
94
- });
95
- init();
96
- this.set("message", message3);
97
- await render(hbs`{{env-tab message=message}}`);
98
-
99
- const expandable = find(".env-table tr");
100
- assert.equal(
101
- expandable.children[1].textContent.trim(),
102
- "an_env_value, 1 more",
103
- "expandable env keys shown correctly"
104
- );
105
-
106
- assert.equal(
107
- findAll("a.expand-list").length,
108
- 1,
109
- "only whitelisted env keys are expandable"
110
- );
111
-
112
- const expandBtn = find("a.expand-list");
113
- assert.equal(expandBtn.textContent.trim(), "1 more");
114
- await click(expandBtn);
115
-
116
- const expanded = find(".env-table tr");
117
- assert.equal(
118
- expanded.children[1].textContent.trim(),
119
- "[an_env_value, anotherthing]",
120
- "expanded env keys shown correctly"
121
- );
122
- });
123
- });
1
+ import { module, test } from "qunit";
2
+ import { setupRenderingTest } from "ember-qunit";
3
+ import { render, find, findAll, click } from "@ember/test-helpers";
4
+ import hbs from "htmlbars-inline-precompile";
5
+ import Message from "client-app/models/message";
6
+ import { init } from "client-app/lib/preload";
7
+
8
+ const message = Message.create({
9
+ env: [{ a: "aa", b: "bb" }, { c: "cc", d: "dd" }]
10
+ });
11
+
12
+ const message2 = Message.create({
13
+ env: { e: "ee", f: "ff" }
14
+ });
15
+
16
+ const message3 = Message.create({
17
+ env: [
18
+ { env_key_2: "value1", default_expanded: "vvv1", notExpanded: "dsdcz" },
19
+ { env_key_2: "value2", default_expanded: "vvv2", notExpanded: "uerue" },
20
+ { env_key_2: "value3", notExpanded: "weeww" },
21
+ { env_key_2: "value4", notExpanded: "cxc" }
22
+ ]
23
+ });
24
+
25
+ function reduceToContent(node) {
26
+ return Array.from(node.childNodes).reduce(
27
+ (ac, cr) => `${ac.textContent}: ${cr.textContent}`
28
+ );
29
+ }
30
+
31
+ module("Integration | Component | env-tab", function(hooks) {
32
+ setupRenderingTest(hooks);
33
+
34
+ test("it renders", async function(assert) {
35
+ this.set("message", message);
36
+ await render(hbs`{{env-tab message=message}}`);
37
+
38
+ assert.equal(
39
+ find(".env-number").textContent,
40
+ "1/2",
41
+ "shows the current over the total number of env objects"
42
+ );
43
+ let trs = findAll("tr");
44
+ assert.equal(trs.length, 2);
45
+ assert.equal(reduceToContent(trs[0]), "a: aa", "has the right content");
46
+ assert.equal(reduceToContent(trs[1]), "b: bb", "has the right content");
47
+
48
+ const buttons = findAll("button.nav-btn");
49
+ // at first page, you can't go back
50
+ assert.ok(buttons[0].disabled, "back buttons are disabled");
51
+ assert.ok(buttons[1].disabled, "back buttons are disabled");
52
+
53
+ assert.notOk(buttons[2].disabled, "forward buttons are not disabled");
54
+ assert.notOk(buttons[3].disabled, "forward buttons are not disabled");
55
+
56
+ this.set("message", message2);
57
+ assert.dom("button").doesNotExist("doesn't show buttons for non-array env");
58
+
59
+ trs = findAll("tr");
60
+ assert.equal(trs.length, 2);
61
+ assert.equal(reduceToContent(trs[0]), "e: ee", "has the right content");
62
+ assert.equal(reduceToContent(trs[1]), "f: ff", "has the right content");
63
+ });
64
+
65
+ test("it works correctly", async function(assert) {
66
+ this.set("message", message);
67
+ await render(hbs`{{env-tab message=message}}`);
68
+
69
+ const buttons = findAll("button.nav-btn");
70
+ await click(buttons[2]);
71
+
72
+ assert.equal(
73
+ find(".env-number").textContent,
74
+ "2/2",
75
+ "shows the current over the total number of env objects"
76
+ );
77
+
78
+ const trs = findAll("tr");
79
+ assert.equal(trs.length, 2);
80
+ assert.equal(reduceToContent(trs[0]), "c: cc", "has the right content");
81
+ assert.equal(reduceToContent(trs[1]), "d: dd", "has the right content");
82
+
83
+ // at last page, you can't go forward but you can go back
84
+ assert.notOk(buttons[0].disabled, "back buttons are not disabled");
85
+ assert.notOk(buttons[1].disabled, "back buttons are not disabled");
86
+
87
+ assert.ok(buttons[2].disabled, "forward buttons are disabled");
88
+ assert.ok(buttons[3].disabled, "forward buttons are disabled");
89
+ });
90
+
91
+ test("expandable env keys", async function(assert) {
92
+ document.getElementById(
93
+ "preloaded-data"
94
+ ).dataset.preloaded = JSON.stringify({
95
+ env_expandable_keys: ["env_key_2", "default_expanded"]
96
+ });
97
+ init();
98
+ this.set("message", message3);
99
+ await render(hbs`{{env-tab message=message}}`);
100
+
101
+ const trs = findAll(".env-table tr");
102
+ const expandable = trs[0];
103
+ const defaultExpanded = trs[1];
104
+
105
+ assert.equal(
106
+ expandable.children[1].textContent.trim(),
107
+ "value1, 3 more",
108
+ "expandable env keys shown correctly"
109
+ );
110
+
111
+ assert.equal(
112
+ defaultExpanded.children[1].textContent.trim(),
113
+ "[vvv1, vvv2]",
114
+ "list is expanded by default when its length is 3 or less"
115
+ );
116
+
117
+ assert.equal(
118
+ findAll("a.expand-list").length,
119
+ 1,
120
+ "only whitelisted env keys are expandable"
121
+ );
122
+
123
+ const expandBtn = find("a.expand-list");
124
+ assert.equal(expandBtn.textContent.trim(), "3 more");
125
+ await click(expandBtn);
126
+
127
+ const expanded = find(".env-table tr");
128
+ assert.equal(
129
+ expanded.children[1].textContent.trim(),
130
+ "[value1, value2, value3, value4]",
131
+ "expanded env keys shown correctly"
132
+ );
133
+ });
134
+ });