Add an acceptance test for the query list page (#110)

Add an acceptance test for the query list page (#110)

diff --git a/test/javascripts/acceptance/list-queries-test.js.es6 b/test/javascripts/acceptance/list-queries-test.js.es6
new file mode 100644
index 0000000..5fb5af7
--- /dev/null
+++ b/test/javascripts/acceptance/list-queries-test.js.es6
@@ -0,0 +1,184 @@
+import {
+  acceptance,
+  exists,
+  query,
+  queryAll,
+} from "discourse/tests/helpers/qunit-helpers";
+import { clearPopupMenuOptionsCallback } from "discourse/controllers/composer";
+import I18n from "I18n";
+
+acceptance("Data Explorer Plugin | List Queries", function (needs) {
+  needs.user();
+  needs.settings({ data_explorer_enabled: true });
+  needs.hooks.beforeEach(() => {
+    clearPopupMenuOptionsCallback();
+  });
+
+  needs.pretender((server, helper) => {
+    server.get("/admin/plugins/explorer/groups.json", () => {
+      return helper.response([
+        {
+          id: 1,
+          name: "admins",
+        },
+        {
+          id: 2,
+          name: "moderators",
+        },
+        {
+          id: 3,
+          name: "staff",
+        },
+        {
+          id: 0,
+          name: "everyone",
+        },
+        {
+          id: 10,
+          name: "trust_level_0",
+        },
+        {
+          id: 11,
+          name: "trust_level_1",
+        },
+        {
+          id: 12,
+          name: "trust_level_2",
+        },
+        {
+          id: 13,
+          name: "trust_level_3",
+        },
+        {
+          id: 14,
+          name: "trust_level_4",
+        },
+      ]);
+    });
+
+    server.get("/admin/plugins/explorer/schema.json", () => {
+      return helper.response({
+        anonymous_users: [
+          {
+            column_name: "id",
+            data_type: "serial",
+            primary: true,
+          },
+          {
+            column_name: "user_id",
+            data_type: "integer",
+            fkey_info: "users",
+          },
+          {
+            column_name: "master_user_id",
+            data_type: "integer",
+            fkey_info: "users",
+          },
+          {
+            column_name: "active",
+            data_type: "boolean",
+          },
+          {
+            column_name: "created_at",
+            data_type: "timestamp",
+          },
+          {
+            column_name: "updated_at",
+            data_type: "timestamp",
+          },
+        ],
+      });
+    });
+
+    server.get("/admin/plugins/explorer/queries", () => {
+      return helper.response({
+        queries: [
+          {
+            id: -5,
+            sql:
+              "-- [params]\n-- int :months_ago = 1\n\nWITH query_period AS\n(SELECT date_trunc('month', CURRENT_DATE) - INTERVAL ':months_ago months' AS period_start,\n                                                    date_trunc('month', CURRENT_DATE) - INTERVAL ':months_ago months' + INTERVAL '1 month' - INTERVAL '1 second' AS period_end)\nSELECT t.id AS topic_id,\n    t.category_id,\n    COUNT(p.id) AS reply_count\nFROM topics t\nJOIN posts p ON t.id = p.topic_id\nJOIN query_period qp ON p.created_at >= qp.period_start\nAND p.created_at <= qp.period_end\nWHERE t.archetype = 'regular'\nAND t.user_id > 0\nGROUP BY t.id\nORDER BY COUNT(p.id) DESC, t.score DESC\nLIMIT 100\n",
+            name: "Top 100 Active Topics",
+            description:
+              "based on the number of replies, it accepts a ‘months_ago’ parameter, defaults to 1 to give results for the last calendar month.",
+            param_info: [
+              {
+                identifier: "months_ago",
+                type: "int",
+                default: "1",
+                nullable: false,
+              },
+            ],
+            created_at: "2021-02-05T16:42:45.572Z",
+            username: "system",
+            group_ids: [],
+            last_run_at: "2021-02-08T15:37:49.188Z",
+            hidden: false,
+            user_id: -1,
+          },
+          {
+            id: -6,
+            sql:
+              "-- [params]\n-- int :months_ago = 1\n\nWITH query_period AS (\n    SELECT\n        date_trunc('month', CURRENT_DATE) - INTERVAL ':months_ago months' as period_start,\n        date_trunc('month', CURRENT_DATE) - INTERVAL ':months_ago months' + INTERVAL '1 month' - INTERVAL '1 second' as period_end\n        )\n\n    SELECT\n        ua.user_id,\n        count(1) AS like_count\n    FROM user_actions ua\n    INNER JOIN query_period qp\n    ON ua.created_at >= qp.period_start\n    AND ua.created_at <= qp.period_end\n    WHERE ua.action_type = 1\n    GROUP BY ua.user_id\n    ORDER BY like_count DESC\n    LIMIT 100\n",
+            name: "Top 100 Likers",
+            description:
+              "returns the top 100 likers for a given monthly period ordered by like_count. It accepts a ‘months_ago’ parameter, defaults to 1 to give results for the last calendar month.",
+            param_info: [
+              {
+                identifier: "months_ago",
+                type: "int",
+                default: "1",
+                nullable: false,
+              },
+            ],
+            created_at: "2021-02-02T12:21:11.449Z",
+            username: "system",
+            group_ids: [],
+            last_run_at: "2021-02-11T08:29:59.337Z",
+            hidden: false,
+            user_id: -1,
+          },
+        ],
+      });
+    });
+  });
+
+  test("it renders the page with the list of queries", async function (assert) {
+    await visit("admin/plugins/explorer");
+
+    assert.ok(
+      query("div.query-list input.ember-text-field").placeholder ===
+        I18n.t("explorer.search_placeholder"),
+      "the search box was rendered"
+    );
+
+    assert.ok(
+      exists("div.query-list button.btn-icon svg.d-icon-plus"),
+      "the add query button was rendered"
+    );
+
+    assert.ok(
+      query("div.query-list button.btn-icon-text span.d-button-label")
+        .innerText === I18n.t("explorer.import.label"),
+      "the import button was rendered"
+    );
+
+    assert.ok(
+      queryAll("div.container table.recent-queries tbody tr").length === 2,
+      "the list of queries was rendered"
+    );
+
+    assert.ok(
+      query(
+        "div.container table.recent-queries tbody tr:nth-child(1) td a"
+      ).innerText.startsWith("Top 100 Likers"),
+      "The first query was rendered"
+    );
+
+    assert.ok(
+      query(
+        "div.container table.recent-queries tbody tr:nth-child(2) td a"
+      ).innerText.startsWith("Top 100 Active Topics"),
+      "The second query was rendered"
+    );
+  });
+});

GitHub sha: cd232589

This commit appears in #110 which was approved by ZogStriP. It was merged by AndrewPrigorshnev.