discourse-data-explorer/spec/lib/tasks/fix_query_ids_spec.rb

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