mirror of
https://github.com/discourse/discourse-data-explorer.git
synced 2025-02-18 01:14:57 +00:00
This rake task is responsible for fixing broken ids - move them back to the original values - ones before migration to a separate table. Rake task can only fix queries with unique names. In the test, we are creating duplicated queries and using `original_id` 4. Spec is ensuring that after rake tasks valuation, queries id is different than `4` However, spec run in random order may create a query with id 4 and in that case, the spec would fail. Therefore, when we create queries for test purpose, we should control what ids they are given to avoid conflict.
150 lines
3.8 KiB
Ruby
150 lines
3.8 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require 'rails_helper'
|
|
|
|
describe 'fix query ids rake task' do
|
|
before do
|
|
Rake::Task.clear
|
|
Discourse::Application.load_tasks
|
|
end
|
|
|
|
let(:query_name) { 'Awesome query' }
|
|
|
|
it 'fixes the ID of the query if they share the same name' do
|
|
original_query_id = 4
|
|
create_plugin_store_row(query_name, original_query_id)
|
|
create_query(query_name)
|
|
|
|
run_task
|
|
|
|
expect(find(query_name).id).to eq(original_query_id)
|
|
end
|
|
|
|
it 'only fixes queries with unique name' do
|
|
original_query_id = 4
|
|
create_plugin_store_row(query_name, original_query_id)
|
|
create_query(query_name)
|
|
create_query(query_name)
|
|
|
|
run_task
|
|
|
|
expect(find(query_name).id).not_to eq(original_query_id)
|
|
end
|
|
|
|
it 'skips queries that already have the same ID' do
|
|
db_query = create_query(query_name)
|
|
last_updated_at = db_query.updated_at
|
|
create_plugin_store_row(query_name, db_query.id)
|
|
|
|
run_task
|
|
|
|
expect(find(query_name).updated_at).to eq_time(last_updated_at)
|
|
end
|
|
|
|
it 'keeps queries the rest of the queries' do
|
|
original_query_id = 4
|
|
different_query_name = 'Another query'
|
|
create_plugin_store_row(query_name, original_query_id)
|
|
create_query(query_name)
|
|
create_query(different_query_name)
|
|
|
|
run_task
|
|
|
|
expect(find(different_query_name)).not_to be_nil
|
|
end
|
|
|
|
it 'works even if they are additional conflicts' do
|
|
different_query_name = 'Another query'
|
|
additional_conflict = create_query(different_query_name)
|
|
create_query(query_name)
|
|
create_plugin_store_row(query_name, additional_conflict.id)
|
|
|
|
run_task
|
|
|
|
expect(find(different_query_name).id).not_to eq(additional_conflict.id)
|
|
expect(find(query_name).id).to eq(additional_conflict.id)
|
|
end
|
|
|
|
context 'query groups' do
|
|
let(:group) { Fabricate(:group) }
|
|
|
|
it "fixes the query group's query_id" do
|
|
original_query_id = 4
|
|
create_query(query_name, [group.id])
|
|
create_plugin_store_row(query_name, original_query_id, [group.id])
|
|
|
|
run_task
|
|
|
|
expect(find_query_group(original_query_id)).not_to be_nil
|
|
end
|
|
|
|
it 'works with additional conflicts' do
|
|
different_query_name = 'Another query'
|
|
additional_conflict = create_query(different_query_name, [group.id])
|
|
create_query(query_name, [group.id])
|
|
create_plugin_store_row(query_name, additional_conflict.id, [group.id])
|
|
|
|
run_task
|
|
|
|
conflict = find(different_query_name).query_groups.first
|
|
fixed = find_query_group(additional_conflict.id)
|
|
|
|
expect(conflict.query_id).not_to eq(additional_conflict.id)
|
|
expect(fixed.query_id).to eq(additional_conflict.id)
|
|
end
|
|
|
|
def find_query_group(id)
|
|
DataExplorer::QueryGroup.find_by(query_id: id)
|
|
end
|
|
end
|
|
|
|
it 'changes the serial sequence for future queries' do
|
|
original_query_id = 4
|
|
create_plugin_store_row(query_name, original_query_id)
|
|
create_query(query_name)
|
|
|
|
run_task
|
|
post_fix_query = create_query(query_name)
|
|
|
|
expect(post_fix_query.id).to eq(original_query_id + 1)
|
|
end
|
|
|
|
def run_task
|
|
Rake::Task['data_explorer:fix_query_ids'].invoke
|
|
end
|
|
|
|
def create_plugin_store_row(name, id, group_ids = [])
|
|
key = "q:#{id}"
|
|
|
|
PluginStore.set(
|
|
DataExplorer.plugin_name,
|
|
key,
|
|
attributes(name).merge(group_ids: group_ids, id: id)
|
|
)
|
|
end
|
|
|
|
def create_query(name, group_ids = [])
|
|
DataExplorer::Query.create!(attributes(name)).tap do |query|
|
|
group_ids.each do |group_id|
|
|
query.query_groups.create!(group_id: group_id)
|
|
end
|
|
end
|
|
end
|
|
|
|
def attributes(name)
|
|
{
|
|
id: DataExplorer::Query.count == 0 ? 5 : DataExplorer::Query.maximum(:id) + 1,
|
|
name: name,
|
|
description: 'A Query',
|
|
sql: "SELECT 1",
|
|
created_at: 3.hours.ago,
|
|
last_run_at: 1.hour.ago,
|
|
hidden: false
|
|
}
|
|
end
|
|
|
|
def find(name)
|
|
DataExplorer::Query.find_by(name: name)
|
|
end
|
|
end
|