2021-12-11 22:18:48 +05:30
|
|
|
# frozen_string_literal: true
|
|
|
|
require 'spec_helper'
|
|
|
|
|
2023-03-04 22:38:38 +05:30
|
|
|
RSpec.shared_examples 'validate path globs' do |path_globs|
|
|
|
|
it 'returns an array of path globs' do
|
|
|
|
expect(path_globs).to be_an(Array)
|
|
|
|
expect(path_globs).to all(be_an(Pathname))
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2021-12-11 22:18:48 +05:30
|
|
|
RSpec.describe Gitlab::Database::GitlabSchema do
|
2023-03-04 22:38:38 +05:30
|
|
|
describe '.views_and_tables_to_schema' do
|
|
|
|
it 'all tables and views have assigned a known gitlab_schema' do
|
|
|
|
expect(described_class.views_and_tables_to_schema).to all(
|
2022-08-13 15:12:31 +05:30
|
|
|
match([be_a(String), be_in(Gitlab::Database.schemas_to_base_models.keys.map(&:to_sym))])
|
2021-12-11 22:18:48 +05:30
|
|
|
)
|
|
|
|
end
|
|
|
|
|
|
|
|
# This being run across different databases indirectly also tests
|
|
|
|
# a general consistency of structure across databases
|
2023-03-04 22:38:38 +05:30
|
|
|
Gitlab::Database.database_base_models.except(:geo).each do |db_config_name, db_class|
|
2021-12-11 22:18:48 +05:30
|
|
|
context "for #{db_config_name} using #{db_class}" do
|
2022-08-13 15:12:31 +05:30
|
|
|
let(:db_data_sources) { db_class.connection.data_sources }
|
|
|
|
|
|
|
|
# The Geo database does not share the same structure as all decomposed databases
|
2023-03-04 22:38:38 +05:30
|
|
|
subject { described_class.views_and_tables_to_schema.select { |_, v| v != :gitlab_geo } }
|
2022-08-13 15:12:31 +05:30
|
|
|
|
2021-12-11 22:18:48 +05:30
|
|
|
it 'new data sources are added' do
|
2023-03-04 22:38:38 +05:30
|
|
|
missing_data_sources = db_data_sources.to_set - subject.keys
|
2021-12-11 22:18:48 +05:30
|
|
|
|
2023-03-04 22:38:38 +05:30
|
|
|
expect(missing_data_sources).to be_empty, \
|
|
|
|
"Missing table/view(s) #{missing_data_sources.to_a} not found in " \
|
|
|
|
"#{described_class}.views_and_tables_to_schema. " \
|
|
|
|
"Any new tables or views must be added to the database dictionary. " \
|
|
|
|
"More info: https://docs.gitlab.com/ee/development/database/database_dictionary.html"
|
2021-12-11 22:18:48 +05:30
|
|
|
end
|
|
|
|
|
|
|
|
it 'non-existing data sources are removed' do
|
2023-03-04 22:38:38 +05:30
|
|
|
extra_data_sources = subject.keys.to_set - db_data_sources
|
2021-12-11 22:18:48 +05:30
|
|
|
|
2023-03-04 22:38:38 +05:30
|
|
|
expect(extra_data_sources).to be_empty, \
|
|
|
|
"Extra table/view(s) #{extra_data_sources.to_a} found in #{described_class}.views_and_tables_to_schema. " \
|
|
|
|
"Any removed or renamed tables or views must be removed from the database dictionary. " \
|
|
|
|
"More info: https://docs.gitlab.com/ee/development/database/database_dictionary.html"
|
2021-12-11 22:18:48 +05:30
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2023-03-04 22:38:38 +05:30
|
|
|
describe '.dictionary_path_globs' do
|
|
|
|
include_examples 'validate path globs', described_class.dictionary_path_globs
|
|
|
|
end
|
|
|
|
|
|
|
|
describe '.view_path_globs' do
|
|
|
|
include_examples 'validate path globs', described_class.view_path_globs
|
|
|
|
end
|
|
|
|
|
|
|
|
describe '.tables_to_schema' do
|
|
|
|
let(:database_models) { Gitlab::Database.database_base_models.except(:geo) }
|
|
|
|
let(:views) { database_models.flat_map { |_, m| m.connection.views }.sort.uniq }
|
|
|
|
|
|
|
|
subject { described_class.tables_to_schema }
|
|
|
|
|
|
|
|
it 'returns only tables' do
|
|
|
|
tables = subject.keys
|
|
|
|
|
|
|
|
expect(tables).not_to include(views.to_set)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe '.views_to_schema' do
|
|
|
|
let(:database_models) { Gitlab::Database.database_base_models.except(:geo) }
|
|
|
|
let(:tables) { database_models.flat_map { |_, m| m.connection.tables }.sort.uniq }
|
|
|
|
|
|
|
|
subject { described_class.views_to_schema }
|
|
|
|
|
|
|
|
it 'returns only views' do
|
|
|
|
views = subject.keys
|
|
|
|
|
|
|
|
expect(views).not_to include(tables.to_set)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2021-12-11 22:18:48 +05:30
|
|
|
describe '.table_schema' do
|
|
|
|
using RSpec::Parameterized::TableSyntax
|
|
|
|
|
|
|
|
where(:name, :classification) do
|
|
|
|
'ci_builds' | :gitlab_ci
|
|
|
|
'my_schema.ci_builds' | :gitlab_ci
|
2022-07-23 23:45:48 +05:30
|
|
|
'information_schema.columns' | :gitlab_internal
|
2021-12-11 22:18:48 +05:30
|
|
|
'audit_events_part_5fc467ac26' | :gitlab_main
|
2022-04-04 11:22:00 +05:30
|
|
|
'_test_gitlab_main_table' | :gitlab_main
|
|
|
|
'_test_gitlab_ci_table' | :gitlab_ci
|
2021-12-11 22:18:48 +05:30
|
|
|
'_test_my_table' | :gitlab_shared
|
2022-07-23 23:45:48 +05:30
|
|
|
'pg_attribute' | :gitlab_internal
|
2021-12-11 22:18:48 +05:30
|
|
|
'my_other_table' | :undefined_my_other_table
|
|
|
|
end
|
|
|
|
|
|
|
|
with_them do
|
|
|
|
subject { described_class.table_schema(name) }
|
|
|
|
|
|
|
|
it { is_expected.to eq(classification) }
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|