From 82dcc5cbfa2f857b1dd688afb8569c2fee61db09 Mon Sep 17 00:00:00 2001 From: Joffrey JAFFEUX Date: Fri, 24 Aug 2018 15:28:01 +0200 Subject: [PATCH] FEATURE: makes reports loadable in bulk (#6309) --- .../admin/components/admin-report.js.es6 | 38 ++-- .../discourse/lib/reports-loader.js.es6 | 87 +++++++++ app/controllers/admin/reports_controller.rb | 101 ++++++---- config/routes.rb | 1 + .../requests/admin/reports_controller_spec.rb | 34 ++++ .../components/admin-report-test.js.es6 | 2 +- .../fixtures/daily-engaged-users.js.es6 | 7 - test/javascripts/fixtures/dau-by-mau.js.es6 | 7 - test/javascripts/fixtures/flags.js.es6 | 7 - test/javascripts/fixtures/likes.js.es6 | 7 - .../fixtures/new-contributors.js.es6 | 7 - .../fixtures/page_view_total_reqs.js.es6 | 90 --------- test/javascripts/fixtures/posts.js.es6 | 7 - test/javascripts/fixtures/reports_bulk.js.es6 | 178 ++++++++++++++++++ test/javascripts/fixtures/signups.js.es6 | 79 -------- .../fixtures/signups_exception.js.es6 | 11 -- .../fixtures/signups_timeout.js.es6 | 11 -- .../fixtures/time_to_first_response.js.es6 | 7 - .../fixtures/top_referred_topics.js.es6 | 7 - test/javascripts/fixtures/topics.js.es6 | 7 - .../fixtures/trending-search.js.es6 | 7 - ..._user_private_messages_with_replies.js.es6 | 7 - .../fixtures/users-by-trust-level.js.es6 | 7 - .../javascripts/fixtures/users-by-type.js.es6 | 7 - test/javascripts/fixtures/visits.js.es6 | 7 - 25 files changed, 388 insertions(+), 342 deletions(-) create mode 100644 app/assets/javascripts/discourse/lib/reports-loader.js.es6 delete mode 100644 test/javascripts/fixtures/daily-engaged-users.js.es6 delete mode 100644 test/javascripts/fixtures/dau-by-mau.js.es6 delete mode 100644 test/javascripts/fixtures/flags.js.es6 delete mode 100644 test/javascripts/fixtures/likes.js.es6 delete mode 100644 test/javascripts/fixtures/new-contributors.js.es6 delete mode 100644 test/javascripts/fixtures/page_view_total_reqs.js.es6 delete mode 100644 test/javascripts/fixtures/posts.js.es6 create mode 100644 test/javascripts/fixtures/reports_bulk.js.es6 delete mode 100644 test/javascripts/fixtures/signups.js.es6 delete mode 100644 test/javascripts/fixtures/signups_exception.js.es6 delete mode 100644 test/javascripts/fixtures/signups_timeout.js.es6 delete mode 100644 test/javascripts/fixtures/time_to_first_response.js.es6 delete mode 100644 test/javascripts/fixtures/top_referred_topics.js.es6 delete mode 100644 test/javascripts/fixtures/topics.js.es6 delete mode 100644 test/javascripts/fixtures/trending-search.js.es6 delete mode 100644 test/javascripts/fixtures/user_to_user_private_messages_with_replies.js.es6 delete mode 100644 test/javascripts/fixtures/users-by-trust-level.js.es6 delete mode 100644 test/javascripts/fixtures/users-by-type.js.es6 delete mode 100644 test/javascripts/fixtures/visits.js.es6 diff --git a/app/assets/javascripts/admin/components/admin-report.js.es6 b/app/assets/javascripts/admin/components/admin-report.js.es6 index ca14a197a23..0a1947e4b4c 100644 --- a/app/assets/javascripts/admin/components/admin-report.js.es6 +++ b/app/assets/javascripts/admin/components/admin-report.js.es6 @@ -1,7 +1,7 @@ +import ReportLoader from "discourse/lib/reports-loader"; import Category from "discourse/models/category"; import { exportEntity } from "discourse/lib/export-csv"; import { outputExportResult } from "discourse/lib/export-result"; -import { ajax } from "discourse/lib/ajax"; import { SCHEMA_VERSION, default as Report } from "admin/models/report"; import computed from "ember-addons/ember-computed-decorators"; import { @@ -95,7 +95,7 @@ export default Ember.Component.extend({ this.get("currentMode") ); } else if (this.get("dataSourceName")) { - this._fetchReport().finally(() => this._computeReport()); + this._fetchReport(); } }, @@ -306,29 +306,31 @@ export default Ember.Component.extend({ this.setProperties({ isLoading: true, rateLimitationString: null }); - let payload = this._buildPayload(["prev_period"]); + Ember.run.next(() => { + let payload = this._buildPayload(["prev_period"]); - return ajax(this.get("dataSource"), payload) - .then(response => { - if (response && response.report) { - this._reports.push(this._loadReport(response.report)); - } else { - console.log("failed loading", this.get("dataSource")); + const callback = response => { + if (!this.element || this.isDestroying || this.isDestroyed) { + return; } - }) - .catch(data => { - if (data.jqXHR && data.jqXHR.status === 429) { + + this.set("isLoading", false); + + if (response === 429) { this.set( "rateLimitationString", I18n.t("admin.dashboard.too_many_requests") ); + } else if (response === 500) { + this.set("model.error", "exception"); + } else if (response) { + this._reports.push(this._loadReport(response)); + this._computeReport(); } - }) - .finally(() => { - if (this.element && !this.isDestroying && !this.isDestroyed) { - this.set("isLoading", false); - } - }); + }; + + ReportLoader.enqueue(this.get("dataSourceName"), payload.data, callback); + }); }, _buildPayload(facets) { diff --git a/app/assets/javascripts/discourse/lib/reports-loader.js.es6 b/app/assets/javascripts/discourse/lib/reports-loader.js.es6 new file mode 100644 index 00000000000..bcdd564ef66 --- /dev/null +++ b/app/assets/javascripts/discourse/lib/reports-loader.js.es6 @@ -0,0 +1,87 @@ +import { ajax } from "discourse/lib/ajax"; +const { debounce } = Ember.run; + +let _queue = []; +let _processing = 0; + +// max number of reports which will be requested in one bulk request +const MAX_JOB_SIZE = 5; + +// max number of concurrent bulk requests +const MAX_CONCURRENCY = 3; + +// max number of jobs stored, first entered jobs will be evicted first +const MAX_QUEUE_SIZE = 20; + +const BULK_REPORTS_ENDPOINT = "/admin/reports/bulk"; + +const DEBOUNCING_DELAY = 50; + +export default { + enqueue(type, params, callback) { + // makes sures the queue is not filling indefinitely + if (_queue.length >= MAX_QUEUE_SIZE) { + const removedJobs = _queue.splice(0, 1)[0]; + removedJobs.forEach(job => { + // this is technically not a 429, but it's the result + // of client doing too many requests so we want the same + // behavior + job.runnable()(429); + }); + } + + _queue.push({ runnable: () => callback, type, params }); + + debounce(this, this._processQueue, DEBOUNCING_DELAY); + }, + + _processQueue() { + if (_queue.length === 0) return; + if (_processing >= MAX_CONCURRENCY) return; + + _processing++; + + const jobs = _queue.splice(0, MAX_JOB_SIZE); + + // if queue has still jobs after splice, we request a future processing + if (_queue.length > 0) { + debounce(this, this._processQueue, DEBOUNCING_DELAY); + } + + let reports = {}; + jobs.forEach(job => { + reports[job.type] = job.params; + }); + + ajax(BULK_REPORTS_ENDPOINT, { data: { reports } }) + .then(response => { + jobs.forEach(job => { + const report = response.reports.findBy("type", job.type); + job.runnable()(report); + }); + }) + .catch(data => { + jobs.forEach(job => { + if (data.jqXHR && data.jqXHR.status === 429) { + job.runnable()(429); + } else if (data.jqXHR && data.jqXHR.status === 500) { + job.runnable()(500); + } else { + job.runnable()(); + } + }); + }) + .finally(() => { + _processing--; + + // when a request is done we want to start processing queue + // without waiting for debouncing + debounce(this, this._processQueue, DEBOUNCING_DELAY, true); + }); + }, + + _reset() { + _queue = []; + _processing = 0; + } +}; diff --git a/app/controllers/admin/reports_controller.rb b/app/controllers/admin/reports_controller.rb index ae90288ec1f..818d8dc3c74 100644 --- a/app/controllers/admin/reports_controller.rb +++ b/app/controllers/admin/reports_controller.rb @@ -18,44 +18,41 @@ class Admin::ReportsController < Admin::AdminController render_json_dump(reports: reports.sort_by { |report| report[:title] }) end + def bulk + reports = [] + + hijack do + params[:reports].each do |report_type, report_params| + args = parse_params(report_params) + + report = nil + if (report_params[:cache]) + report = Report.find_cached(report_type, args) + end + + if report + reports << report + else + report = Report.find(report_type, args) + + if (report_params[:cache]) && report + Report.cache(report, 35.minutes) + end + + reports << report if report + end + end + + render_json_dump(reports: reports) + end + end + def show report_type = params[:type] raise Discourse::NotFound unless report_type =~ /^[a-z0-9\_]+$/ - start_date = (params[:start_date].present? ? Time.parse(params[:start_date]).to_date : 1.days.ago).beginning_of_day - end_date = (params[:end_date].present? ? Time.parse(params[:end_date]).to_date : start_date + 30.days).end_of_day - - if params.has_key?(:category_id) && params[:category_id].to_i > 0 - category_id = params[:category_id].to_i - else - category_id = nil - end - - if params.has_key?(:group_id) && params[:group_id].to_i > 0 - group_id = params[:group_id].to_i - else - group_id = nil - end - - facets = nil - if Array === params[:facets] - facets = params[:facets].map { |s| s.to_s.to_sym } - end - - limit = nil - if params.has_key?(:limit) && params[:limit].to_i > 0 - limit = params[:limit].to_i - end - - args = { - start_date: start_date, - end_date: end_date, - category_id: category_id, - group_id: group_id, - facets: facets, - limit: limit - } + args = parse_params(params) report = nil if (params[:cache]) @@ -77,7 +74,43 @@ class Admin::ReportsController < Admin::AdminController render_json_dump(report: report) end - end + private + + def parse_params(report_params) + start_date = (report_params[:start_date].present? ? Time.parse(report_params[:start_date]).to_date : 1.days.ago).beginning_of_day + end_date = (report_params[:end_date].present? ? Time.parse(report_params[:end_date]).to_date : start_date + 30.days).end_of_day + + if report_params.has_key?(:category_id) && report_params[:category_id].to_i > 0 + category_id = report_params[:category_id].to_i + else + category_id = nil + end + + if report_params.has_key?(:group_id) && report_params[:group_id].to_i > 0 + group_id = report_params[:group_id].to_i + else + group_id = nil + end + + facets = nil + if Array === report_params[:facets] + facets = report_params[:facets].map { |s| s.to_s.to_sym } + end + + limit = nil + if report_params.has_key?(:limit) && report_params[:limit].to_i > 0 + limit = report_params[:limit].to_i + end + + { + start_date: start_date, + end_date: end_date, + category_id: category_id, + group_id: group_id, + facets: facets, + limit: limit + } + end end diff --git a/config/routes.rb b/config/routes.rb index 15214adabba..6308048a149 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -76,6 +76,7 @@ Discourse::Application.routes.draw do end get "reports" => "reports#index" + get "reports/bulk" => "reports#bulk" get "reports/:type" => "reports#show" resources :groups, constraints: AdminConstraint.new do diff --git a/spec/requests/admin/reports_controller_spec.rb b/spec/requests/admin/reports_controller_spec.rb index 27795f6579b..793af3d217c 100644 --- a/spec/requests/admin/reports_controller_spec.rb +++ b/spec/requests/admin/reports_controller_spec.rb @@ -13,6 +13,40 @@ describe Admin::ReportsController do sign_in(admin) end + describe '#bulk' do + context "valid params" do + it "renders the reports as JSON" do + Fabricate(:topic) + get "/admin/reports/bulk.json", params: { + reports: { + topics: { limit: 10 }, + likes: { limit: 10 } + } + } + + expect(response.status).to eq(200) + expect(JSON.parse(response.body)["reports"].count).to eq(2) + end + end + + context "invalid params" do + context "inexisting report" do + it "returns only existing reports" do + get "/admin/reports/bulk.json", params: { + reports: { + topics: { limit: 10 }, + xxx: { limit: 10 } + } + } + + expect(response.status).to eq(200) + expect(JSON.parse(response.body)["reports"].count).to eq(1) + expect(JSON.parse(response.body)["reports"][0]["type"]).to eq("topics") + end + end + end + end + describe '#show' do context "invalid id form" do let(:invalid_id) { "!!&asdfasdf" } diff --git a/test/javascripts/components/admin-report-test.js.es6 b/test/javascripts/components/admin-report-test.js.es6 index d92ef4051fb..0c3ef3890e9 100644 --- a/test/javascripts/components/admin-report-test.js.es6 +++ b/test/javascripts/components/admin-report-test.js.es6 @@ -138,7 +138,7 @@ componentTest("rate limited", { }; // prettier-ignore - server.get("/admin/reports/signups_rate_limited", () => { //eslint-disable-line + server.get("/admin/reports/bulk", () => { //eslint-disable-line return response({"errors":["You’ve performed this action too many times. Please wait 10 seconds before trying again."],"error_type":"rate_limit","extras":{"wait_seconds":10}}); }); }, diff --git a/test/javascripts/fixtures/daily-engaged-users.js.es6 b/test/javascripts/fixtures/daily-engaged-users.js.es6 deleted file mode 100644 index 462e3898553..00000000000 --- a/test/javascripts/fixtures/daily-engaged-users.js.es6 +++ /dev/null @@ -1,7 +0,0 @@ -export default { - "/admin/reports/daily_engaged_users": { - report: { - report_key: "daily_engaged_users" - } - } -}; diff --git a/test/javascripts/fixtures/dau-by-mau.js.es6 b/test/javascripts/fixtures/dau-by-mau.js.es6 deleted file mode 100644 index 77b5a25f2e4..00000000000 --- a/test/javascripts/fixtures/dau-by-mau.js.es6 +++ /dev/null @@ -1,7 +0,0 @@ -export default { - "/admin/reports/dau_by_mau": { - report: { - report_key: "dau_by_mau" - } - } -}; diff --git a/test/javascripts/fixtures/flags.js.es6 b/test/javascripts/fixtures/flags.js.es6 deleted file mode 100644 index ed72a10dbf4..00000000000 --- a/test/javascripts/fixtures/flags.js.es6 +++ /dev/null @@ -1,7 +0,0 @@ -export default { - "/admin/reports/flags": { - report: { - report_key: "flags" - } - } -}; diff --git a/test/javascripts/fixtures/likes.js.es6 b/test/javascripts/fixtures/likes.js.es6 deleted file mode 100644 index 5c4d7c4eff8..00000000000 --- a/test/javascripts/fixtures/likes.js.es6 +++ /dev/null @@ -1,7 +0,0 @@ -export default { - "/admin/reports/likes": { - report: { - report_key: "likes" - } - } -}; diff --git a/test/javascripts/fixtures/new-contributors.js.es6 b/test/javascripts/fixtures/new-contributors.js.es6 deleted file mode 100644 index 8d688a1a1c2..00000000000 --- a/test/javascripts/fixtures/new-contributors.js.es6 +++ /dev/null @@ -1,7 +0,0 @@ -export default { - "/admin/reports/new_contributors": { - report: { - report_key: "new_contributors" - } - } -}; diff --git a/test/javascripts/fixtures/page_view_total_reqs.js.es6 b/test/javascripts/fixtures/page_view_total_reqs.js.es6 deleted file mode 100644 index 4b66b1b5f89..00000000000 --- a/test/javascripts/fixtures/page_view_total_reqs.js.es6 +++ /dev/null @@ -1,90 +0,0 @@ -const startDate = moment() - .locale("en") - .utc() - .startOf("day") - .subtract(1, "month"); - -const endDate = moment() - .locale("en") - .utc() - .endOf("day"); - -const data = [ - 851, - 3805, - 2437, - 3768, - 4476, - 3021, - 1285, - 1120, - 3932, - 2777, - 3298, - 3198, - 3601, - 1249, - 1046, - 3212, - 3358, - 3306, - 2618, - 2679, - 910, - 875, - 3877, - 2342, - 2305, - 3534, - 3713, - 1133, - 1350, - 4048, - 2523, - 1062 -]; - -export default { - "/admin/reports/page_view_total_reqs": { - report: { - type: "page_view_total_reqs", - title: "Pageviews", - xaxis: "Day", - yaxis: "Total Pageviews", - description: null, - data: [...data].map((d, i) => { - return { - x: moment(startDate) - .add(i, "days") - .format("YYYY-MM-DD"), - y: d - }; - }), - start_date: startDate.toISOString(), - end_date: endDate.toISOString(), - prev_data: null, - prev_start_date: "2018-06-20T00:00:00Z", - prev_end_date: "2018-07-23T00:00:00Z", - category_id: null, - group_id: null, - prev30Days: 58110, - dates_filtering: true, - report_key: `reports:page_view_total_reqs:${startDate.format( - "YYYYMMDD" - )}:${endDate.format("YYYYMMDD")}:[:prev_period]:2`, - labels: [ - { type: "date", property: "x", title: "Day" }, - { type: "number", property: "y", title: "Count" } - ], - processing: false, - average: false, - percent: false, - higher_is_better: true, - category_filtering: false, - group_filtering: false, - modes: ["table", "chart"], - icon: "file", - total: 921672 - } - } -}; diff --git a/test/javascripts/fixtures/posts.js.es6 b/test/javascripts/fixtures/posts.js.es6 deleted file mode 100644 index 0f690625fee..00000000000 --- a/test/javascripts/fixtures/posts.js.es6 +++ /dev/null @@ -1,7 +0,0 @@ -export default { - "/admin/reports/posts": { - report: { - report_key: "posts" - } - } -}; diff --git a/test/javascripts/fixtures/reports_bulk.js.es6 b/test/javascripts/fixtures/reports_bulk.js.es6 new file mode 100644 index 00000000000..e361b462ca8 --- /dev/null +++ b/test/javascripts/fixtures/reports_bulk.js.es6 @@ -0,0 +1,178 @@ +let signups = { + type: "signups", + title: "Signups", + xaxis: "Day", + yaxis: "Number of signups", + description: "New account registrations for this period", + data: [ + { x: "2018-06-16", y: 12 }, + { x: "2018-06-17", y: 16 }, + { x: "2018-06-18", y: 42 }, + { x: "2018-06-19", y: 38 }, + { x: "2018-06-20", y: 41 }, + { x: "2018-06-21", y: 32 }, + { x: "2018-06-22", y: 23 }, + { x: "2018-06-23", y: 23 }, + { x: "2018-06-24", y: 17 }, + { x: "2018-06-25", y: 27 }, + { x: "2018-06-26", y: 32 }, + { x: "2018-06-27", y: 7 } + ], + start_date: "2018-06-16T00:00:00Z", + end_date: "2018-07-16T23:59:59Z", + prev_data: [ + { x: "2018-05-17", y: 32 }, + { x: "2018-05-18", y: 30 }, + { x: "2018-05-19", y: 12 }, + { x: "2018-05-20", y: 23 }, + { x: "2018-05-21", y: 50 }, + { x: "2018-05-22", y: 39 }, + { x: "2018-05-23", y: 51 }, + { x: "2018-05-24", y: 48 }, + { x: "2018-05-25", y: 37 }, + { x: "2018-05-26", y: 17 }, + { x: "2018-05-27", y: 6 }, + { x: "2018-05-28", y: 20 }, + { x: "2018-05-29", y: 37 }, + { x: "2018-05-30", y: 37 }, + { x: "2018-05-31", y: 37 }, + { x: "2018-06-01", y: 38 }, + { x: "2018-06-02", y: 23 }, + { x: "2018-06-03", y: 18 }, + { x: "2018-06-04", y: 39 }, + { x: "2018-06-05", y: 26 }, + { x: "2018-06-06", y: 39 }, + { x: "2018-06-07", y: 52 }, + { x: "2018-06-08", y: 35 }, + { x: "2018-06-09", y: 19 }, + { x: "2018-06-10", y: 15 }, + { x: "2018-06-11", y: 31 }, + { x: "2018-06-12", y: 38 }, + { x: "2018-06-13", y: 30 }, + { x: "2018-06-14", y: 45 }, + { x: "2018-06-15", y: 37 }, + { x: "2018-06-16", y: 12 } + ], + prev_start_date: "2018-05-17T00:00:00Z", + prev_end_date: "2018-06-17T00:00:00Z", + category_id: null, + group_id: null, + prev30Days: null, + dates_filtering: true, + report_key: "reports:signups::20180616:20180716::[:prev_period]:", + labels: [ + { type: "date", properties: ["x"], title: "Day" }, + { type: "number", properties: ["y"], title: "Count" } + ], + processing: false, + average: false, + percent: false, + higher_is_better: true, + category_filtering: false, + group_filtering: true, + modes: ["table", "chart"], + prev_period: 961 +}; + +let signups_fixture = JSON.parse(JSON.stringify(signups)); +signups_fixture.type = "signups_exception"; +signups_fixture.error = "exception"; +const signups_exception = signups_fixture; + +signups_fixture = JSON.parse(JSON.stringify(signups)); +signups_fixture.type = "signups_timeout"; +signups_fixture.error = "timeout"; +const signups_timeout = signups_fixture; + +const startDate = moment() + .locale("en") + .utc() + .startOf("day") + .subtract(1, "month"); + +const endDate = moment() + .locale("en") + .utc() + .endOf("day"); + +const data = [ + 851, + 3805, + 2437, + 3768, + 4476, + 3021, + 1285, + 1120, + 3932, + 2777, + 3298, + 3198, + 3601, + 1249, + 1046, + 3212, + 3358, + 3306, + 2618, + 2679, + 910, + 875, + 3877, + 2342, + 2305, + 3534, + 3713, + 1133, + 1350, + 4048, + 2523, + 1062 +]; + +const page_view_total_reqs = { + type: "page_view_total_reqs", + title: "Pageviews", + xaxis: "Day", + yaxis: "Total Pageviews", + description: null, + data: [...data].map((d, i) => { + return { + x: moment(startDate) + .add(i, "days") + .format("YYYY-MM-DD"), + y: d + }; + }), + start_date: startDate.toISOString(), + end_date: endDate.toISOString(), + prev_data: null, + prev_start_date: "2018-06-20T00:00:00Z", + prev_end_date: "2018-07-23T00:00:00Z", + category_id: null, + group_id: null, + prev30Days: 58110, + dates_filtering: true, + report_key: `reports:page_view_total_reqs:${startDate.format( + "YYYYMMDD" + )}:${endDate.format("YYYYMMDD")}:[:prev_period]:2`, + labels: [ + { type: "date", property: "x", title: "Day" }, + { type: "number", property: "y", title: "Count" } + ], + processing: false, + average: false, + percent: false, + higher_is_better: true, + category_filtering: false, + group_filtering: false, + modes: ["table", "chart"], + icon: "file", + total: 921672 +}; + +export default { + "/admin/reports/bulk": { + reports: [signups, signups_exception, signups_timeout, page_view_total_reqs] + } +}; diff --git a/test/javascripts/fixtures/signups.js.es6 b/test/javascripts/fixtures/signups.js.es6 deleted file mode 100644 index f6319902fed..00000000000 --- a/test/javascripts/fixtures/signups.js.es6 +++ /dev/null @@ -1,79 +0,0 @@ -export default { - "/admin/reports/signups": { - report: { - type: "signups", - title: "Signups", - xaxis: "Day", - yaxis: "Number of signups", - description: "New account registrations for this period", - data: [ - { x: "2018-06-16", y: 12 }, - { x: "2018-06-17", y: 16 }, - { x: "2018-06-18", y: 42 }, - { x: "2018-06-19", y: 38 }, - { x: "2018-06-20", y: 41 }, - { x: "2018-06-21", y: 32 }, - { x: "2018-06-22", y: 23 }, - { x: "2018-06-23", y: 23 }, - { x: "2018-06-24", y: 17 }, - { x: "2018-06-25", y: 27 }, - { x: "2018-06-26", y: 32 }, - { x: "2018-06-27", y: 7 } - ], - start_date: "2018-06-16T00:00:00Z", - end_date: "2018-07-16T23:59:59Z", - prev_data: [ - { x: "2018-05-17", y: 32 }, - { x: "2018-05-18", y: 30 }, - { x: "2018-05-19", y: 12 }, - { x: "2018-05-20", y: 23 }, - { x: "2018-05-21", y: 50 }, - { x: "2018-05-22", y: 39 }, - { x: "2018-05-23", y: 51 }, - { x: "2018-05-24", y: 48 }, - { x: "2018-05-25", y: 37 }, - { x: "2018-05-26", y: 17 }, - { x: "2018-05-27", y: 6 }, - { x: "2018-05-28", y: 20 }, - { x: "2018-05-29", y: 37 }, - { x: "2018-05-30", y: 37 }, - { x: "2018-05-31", y: 37 }, - { x: "2018-06-01", y: 38 }, - { x: "2018-06-02", y: 23 }, - { x: "2018-06-03", y: 18 }, - { x: "2018-06-04", y: 39 }, - { x: "2018-06-05", y: 26 }, - { x: "2018-06-06", y: 39 }, - { x: "2018-06-07", y: 52 }, - { x: "2018-06-08", y: 35 }, - { x: "2018-06-09", y: 19 }, - { x: "2018-06-10", y: 15 }, - { x: "2018-06-11", y: 31 }, - { x: "2018-06-12", y: 38 }, - { x: "2018-06-13", y: 30 }, - { x: "2018-06-14", y: 45 }, - { x: "2018-06-15", y: 37 }, - { x: "2018-06-16", y: 12 } - ], - prev_start_date: "2018-05-17T00:00:00Z", - prev_end_date: "2018-06-17T00:00:00Z", - category_id: null, - group_id: null, - prev30Days: null, - dates_filtering: true, - report_key: "reports:signups::20180616:20180716::[:prev_period]:", - labels: [ - { type: "date", properties: ["x"], title: "Day" }, - { type: "number", properties: ["y"], title: "Count" } - ], - processing: false, - average: false, - percent: false, - higher_is_better: true, - category_filtering: false, - group_filtering: true, - modes: ["table", "chart"], - prev_period: 961 - } - } -}; diff --git a/test/javascripts/fixtures/signups_exception.js.es6 b/test/javascripts/fixtures/signups_exception.js.es6 deleted file mode 100644 index 9924484a8fc..00000000000 --- a/test/javascripts/fixtures/signups_exception.js.es6 +++ /dev/null @@ -1,11 +0,0 @@ -import signups from "fixtures/signups"; - -const signupsExceptionKey = "/admin/reports/signups_exception"; -const signupsKey = "/admin/reports/signups"; - -let fixture = {}; - -fixture[signupsExceptionKey] = JSON.parse(JSON.stringify(signups[signupsKey])); -fixture[signupsExceptionKey].report.error = "exception"; - -export default fixture; diff --git a/test/javascripts/fixtures/signups_timeout.js.es6 b/test/javascripts/fixtures/signups_timeout.js.es6 deleted file mode 100644 index 9af1e2b8a89..00000000000 --- a/test/javascripts/fixtures/signups_timeout.js.es6 +++ /dev/null @@ -1,11 +0,0 @@ -import signups from "fixtures/signups"; - -const signupsTimeoutKey = "/admin/reports/signups_timeout"; -const signupsKey = "/admin/reports/signups"; - -let fixture = {}; - -fixture[signupsTimeoutKey] = JSON.parse(JSON.stringify(signups[signupsKey])); -fixture[signupsTimeoutKey].report.error = "timeout"; - -export default fixture; diff --git a/test/javascripts/fixtures/time_to_first_response.js.es6 b/test/javascripts/fixtures/time_to_first_response.js.es6 deleted file mode 100644 index 5d7135f38a8..00000000000 --- a/test/javascripts/fixtures/time_to_first_response.js.es6 +++ /dev/null @@ -1,7 +0,0 @@ -export default { - "/admin/reports/time_to_first_response": { - report: { - report_key: "time_to_first_response" - } - } -}; diff --git a/test/javascripts/fixtures/top_referred_topics.js.es6 b/test/javascripts/fixtures/top_referred_topics.js.es6 deleted file mode 100644 index 231736a92d7..00000000000 --- a/test/javascripts/fixtures/top_referred_topics.js.es6 +++ /dev/null @@ -1,7 +0,0 @@ -export default { - "/admin/reports/top_referred_topics": { - report: { - report_key: "top_referred_topics" - } - } -}; diff --git a/test/javascripts/fixtures/topics.js.es6 b/test/javascripts/fixtures/topics.js.es6 deleted file mode 100644 index 00257dc13bf..00000000000 --- a/test/javascripts/fixtures/topics.js.es6 +++ /dev/null @@ -1,7 +0,0 @@ -export default { - "/admin/reports/topics": { - report: { - report_key: "topics" - } - } -}; diff --git a/test/javascripts/fixtures/trending-search.js.es6 b/test/javascripts/fixtures/trending-search.js.es6 deleted file mode 100644 index 906867eb7c9..00000000000 --- a/test/javascripts/fixtures/trending-search.js.es6 +++ /dev/null @@ -1,7 +0,0 @@ -export default { - "/admin/reports/trending_search": { - report: { - report_key: "trending_search" - } - } -}; diff --git a/test/javascripts/fixtures/user_to_user_private_messages_with_replies.js.es6 b/test/javascripts/fixtures/user_to_user_private_messages_with_replies.js.es6 deleted file mode 100644 index 2030d982a1f..00000000000 --- a/test/javascripts/fixtures/user_to_user_private_messages_with_replies.js.es6 +++ /dev/null @@ -1,7 +0,0 @@ -export default { - "/admin/reports/user_to_user_private_messages_with_replies": { - report: { - report_key: "user_to_user_private_messages_with_replies" - } - } -}; diff --git a/test/javascripts/fixtures/users-by-trust-level.js.es6 b/test/javascripts/fixtures/users-by-trust-level.js.es6 deleted file mode 100644 index 0d59c577c26..00000000000 --- a/test/javascripts/fixtures/users-by-trust-level.js.es6 +++ /dev/null @@ -1,7 +0,0 @@ -export default { - "/admin/reports/users_by_trust_level": { - report: { - report_key: "users_by_trust_level" - } - } -}; diff --git a/test/javascripts/fixtures/users-by-type.js.es6 b/test/javascripts/fixtures/users-by-type.js.es6 deleted file mode 100644 index 56d3e611834..00000000000 --- a/test/javascripts/fixtures/users-by-type.js.es6 +++ /dev/null @@ -1,7 +0,0 @@ -export default { - "/admin/reports/users_by_type": { - report: { - report_key: "users_by_type" - } - } -}; diff --git a/test/javascripts/fixtures/visits.js.es6 b/test/javascripts/fixtures/visits.js.es6 deleted file mode 100644 index de7937e2cff..00000000000 --- a/test/javascripts/fixtures/visits.js.es6 +++ /dev/null @@ -1,7 +0,0 @@ -export default { - "/admin/reports/visits": { - report: { - report_key: "posts" - } - } -};