1
1
require 'spec_helper'
2
2
3
- def execute ( query , context = { } )
4
- CacheSchema . execute ( query , context : context )
5
- end
6
-
7
3
RSpec . describe 'caching connection fields' do
8
4
class StubLogger < Logger
9
5
def initialize
@@ -19,7 +15,7 @@ def messages
19
15
let ( :query ) do
20
16
%Q{
21
17
{
22
- customer(id: #{ Customer . last . id } ) {
18
+ customer(id: #{ customer . id } ) {
23
19
orders {
24
20
edges {
25
21
node {
@@ -35,31 +31,71 @@ def messages
35
31
let ( :sql_logger ) do
36
32
StubLogger . new . tap do |logger |
37
33
logger . formatter = proc do |_severity , _datetime , _progname , msg |
38
- raw_sql = msg . match ( /\( .* \) \s (?<sql>.*)/ ) [ "sql" ]
34
+ raw_sql = msg . match ( /.* (?<sql>SELECT .*)/ ) [ "sql" ]
39
35
40
36
"#{ raw_sql } \n "
41
37
end
42
38
end
43
39
end
44
40
45
- before { DB . logger = sql_logger }
41
+ shared_examples "be a correct cold and warm" do
42
+ let ( :reference ) do
43
+ { "data" => { "customer" => { "orders" => { "edges" => [ { "node" => { "id" => 1 } } , { "node" => { "id" => 2 } } , { "node" => { "id" => 3 } } ] } } } }
44
+ end
45
+
46
+ it 'produces the same result on miss or hit' do
47
+ cold_results = execute ( query )
48
+ warm_results = execute ( query )
49
+
50
+ expect ( cold_results ) . to eq ( reference )
51
+ expect ( cold_results ) . to eq warm_results
52
+ end
53
+ end
54
+
55
+ describe 'Seqeul' do
56
+ def execute ( query , context = { } )
57
+ CacheSchema . execute ( query , context : context )
58
+ end
59
+ let ( :customer ) { Customer . last }
60
+
61
+ before { DB . logger = sql_logger }
62
+
63
+ it_behaves_like "be a correct cold and warm"
46
64
47
- it 'produces the same result on miss or hit' do
48
- cold_results = execute ( query )
49
- warm_results = execute ( query )
65
+ it 'calls sql engine only one time per cached field' do
66
+ 5 . times { execute ( query ) }
50
67
51
- expect ( cold_results ) . to eq warm_results
68
+ expect ( sql_logger . messages ) . to eq (
69
+ <<~SQL
70
+ SELECT * FROM `customers` ORDER BY `id` DESC LIMIT 1
71
+ SELECT * FROM `customers` WHERE `id` = '1'
72
+ SELECT * FROM `orders` WHERE (`orders`.`customer_id` = 1)
73
+ SQL
74
+ )
75
+ end
52
76
end
53
77
54
- it 'calls sql engine only one time per cached field' do
55
- 5 . times { execute ( query ) }
78
+ describe 'ActiveRecord' do
79
+ def execute ( query , context = { } )
80
+ AR ::CacheSchema . execute ( query , context : context )
81
+ end
82
+
83
+ let ( :customer ) { AR ::Customer . last }
56
84
57
- expect ( sql_logger . messages ) . to eq (
58
- <<~SQL
59
- SELECT * FROM `customers` ORDER BY `id` DESC LIMIT 1
60
- SELECT * FROM `customers` WHERE `id` = '1'
61
- SELECT * FROM `orders` WHERE (`orders`.`customer_id` = 1)
62
- SQL
63
- )
85
+ before { ActiveRecord ::Base . logger = sql_logger }
86
+
87
+ it_behaves_like "be a correct cold and warm"
88
+
89
+ it 'calls sql engine only one time per cached field' do
90
+ 5 . times { execute ( query ) }
91
+
92
+ expect ( sql_logger . messages ) . to eq (
93
+ <<~SQL
94
+ SELECT "customers".* FROM "customers" ORDER BY "customers"."id" DESC LIMIT ? [["LIMIT", 1]]
95
+ SELECT "customers".* FROM "customers" WHERE "customers"."id" = ? LIMIT ? [["id", 1], ["LIMIT", 1]]
96
+ SELECT "orders".* FROM "orders" WHERE "orders"."customer_id" = ? [["customer_id", 1]]
97
+ SQL
98
+ )
99
+ end
64
100
end
65
101
end
0 commit comments