Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
G
gitlab-ce
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
1
Merge Requests
1
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
gitlab-ce
Commits
a09a1638
Commit
a09a1638
authored
Jan 28, 2022
by
pbair
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Fix tests for EachDatabase iteration
parent
ca5b6b48
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
77 additions
and
25 deletions
+77
-25
lib/gitlab/database/each_database.rb
lib/gitlab/database/each_database.rb
+1
-1
spec/lib/gitlab/database/each_database_spec.rb
spec/lib/gitlab/database/each_database_spec.rb
+76
-24
No files found.
lib/gitlab/database/each_database.rb
View file @
a09a1638
...
...
@@ -31,7 +31,7 @@ module Gitlab
def
with_shared_model_connections
(
shared_model
,
&
blk
)
Gitlab
::
Database
.
database_base_models
.
each_pair
do
|
connection_name
,
connection_model
|
if
shared_model
.
limit_connection_names
next
unless
shared_model
.
limit_connection_names
.
include?
(
connection_name
)
next
unless
shared_model
.
limit_connection_names
.
include?
(
connection_name
.
to_sym
)
end
with_shared_connection
(
connection_model
.
connection
,
connection_name
)
do
...
...
spec/lib/gitlab/database/each_database_spec.rb
View file @
a09a1638
...
...
@@ -4,45 +4,97 @@ require 'spec_helper'
RSpec
.
describe
Gitlab
::
Database
::
EachDatabase
do
describe
'.each_database_connection'
do
let
(
:expected_connections
)
do
Gitlab
::
Database
.
database_base_models
.
map
{
|
name
,
model
|
[
model
.
connection
,
name
]
}
before
do
allow
(
Gitlab
::
Database
).
to
receive
(
:database_base_models
)
.
and_return
({
main:
ActiveRecord
::
Base
,
ci:
Ci
::
ApplicationRecord
}.
with_indifferent_access
)
end
it
'yields each connection after connecting SharedModel'
do
expected_connections
.
each
do
|
connection
,
_
|
expect
(
Gitlab
::
Database
::
SharedModel
).
to
receive
(
:using_connection
).
with
(
connection
).
and_yield
end
it
'yields each connection after connecting SharedModel'
,
:add_ci_connection
do
expect
(
Gitlab
::
Database
::
SharedModel
).
to
receive
(
:using_connection
)
.
with
(
ActiveRecord
::
Base
.
connection
).
ordered
.
and_yield
yielded_connections
=
[]
expect
(
Gitlab
::
Database
::
SharedModel
).
to
receive
(
:using_connection
)
.
with
(
Ci
::
ApplicationRecord
.
connection
).
ordered
.
and_yield
described_class
.
each_database_connection
do
|
connection
,
name
|
yielded_connections
<<
[
connection
,
name
]
end
expect
(
yielded_connections
).
to
match_array
(
expected_connections
)
expect
{
|
b
|
described_class
.
each_database_connection
(
&
b
)
}
.
to
yield_successive_args
(
[
ActiveRecord
::
Base
.
connection
,
'main'
],
[
Ci
::
ApplicationRecord
.
connection
,
'ci'
]
)
end
end
describe
'.each_model_connection'
do
let
(
:model1
)
{
double
(
connection:
double
,
table_name:
'table1'
)
}
let
(
:model2
)
{
double
(
connection:
double
,
table_name:
'table2'
)
}
context
'when the model inherits from SharedModel'
,
:add_ci_connection
do
let
(
:model1
)
{
Class
.
new
(
Gitlab
::
Database
::
SharedModel
)
}
let
(
:model2
)
{
Class
.
new
(
Gitlab
::
Database
::
SharedModel
)
}
before
do
allow
(
model1
.
connection
).
to
receive_message_chain
(
'pool.db_config.name'
).
and_return
(
'name1'
)
allow
(
model2
.
connection
).
to
receive_message_chain
(
'pool.db_config.name'
).
and_return
(
'name2'
)
before
do
allow
(
Gitlab
::
Database
).
to
receive
(
:database_base_models
)
.
and_return
({
main:
ActiveRecord
::
Base
,
ci:
Ci
::
ApplicationRecord
}.
with_indifferent_access
)
end
it
'yields each model with SharedModel connected to each database connection'
do
expect_yielded_models
([
model1
,
model2
],
[
{
model:
model1
,
connection:
ActiveRecord
::
Base
.
connection
,
name:
'main'
},
{
model:
model1
,
connection:
Ci
::
ApplicationRecord
.
connection
,
name:
'ci'
},
{
model:
model2
,
connection:
ActiveRecord
::
Base
.
connection
,
name:
'main'
},
{
model:
model2
,
connection:
Ci
::
ApplicationRecord
.
connection
,
name:
'ci'
}
])
end
context
'when the model limits connection names'
do
before
do
model1
.
limit_connection_names
=
%i[main]
model2
.
limit_connection_names
=
%i[ci]
end
it
'only yields the model with SharedModel connected to the limited connections'
do
expect_yielded_models
([
model1
,
model2
],
[
{
model:
model1
,
connection:
ActiveRecord
::
Base
.
connection
,
name:
'main'
},
{
model:
model2
,
connection:
Ci
::
ApplicationRecord
.
connection
,
name:
'ci'
}
])
end
end
end
context
'when the model does not inherit from SharedModel'
do
let
(
:main_model
)
{
Class
.
new
(
ActiveRecord
::
Base
)
}
let
(
:ci_model
)
{
Class
.
new
(
Ci
::
ApplicationRecord
)
}
let
(
:main_connection
)
{
double
(
:connection
)
}
let
(
:ci_connection
)
{
double
(
:connection
)
}
before
do
allow
(
main_model
).
to
receive
(
:connection
).
and_return
(
main_connection
)
allow
(
ci_model
).
to
receive
(
:connection
).
and_return
(
ci_connection
)
allow
(
main_connection
).
to
receive_message_chain
(
'pool.db_config.name'
).
and_return
(
'main'
)
allow
(
ci_connection
).
to
receive_message_chain
(
'pool.db_config.name'
).
and_return
(
'ci'
)
end
it
'yields each model after connecting SharedModel'
do
expect_yielded_models
([
main_model
,
ci_model
],
[
{
model:
main_model
,
connection:
main_connection
,
name:
'main'
},
{
model:
ci_model
,
connection:
ci_connection
,
name:
'ci'
}
])
end
end
it
'yields each model after connecting SharedModel'
do
expect
(
Gitlab
::
Database
::
SharedModel
).
to
receive
(
:using_connection
).
with
(
model1
.
connection
).
and_yield
expect
(
Gitlab
::
Database
::
SharedModel
).
to
receive
(
:using_connection
).
with
(
model2
.
connection
).
and_yield
def
expect_yielded_models
(
models_to_iterate
,
expected_values
)
times_yielded
=
0
described_class
.
each_model_connection
(
models_to_iterate
)
do
|
model
,
name
|
expected
=
expected_values
[
times_yielded
]
yielded_models
=
[]
expect
(
model
).
to
be
(
expected
[
:model
])
expect
(
model
.
connection
).
to
be
(
expected
[
:connection
])
expect
(
name
).
to
eq
(
expected
[
:name
])
described_class
.
each_model_connection
([
model1
,
model2
])
do
|
model
,
name
|
yielded_models
<<
[
model
,
name
]
times_yielded
+=
1
end
expect
(
yielded_models
).
to
match_array
([[
model1
,
'name1'
],
[
model2
,
'name2'
]]
)
expect
(
times_yielded
).
to
eq
(
expected_values
.
size
)
end
end
end
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment