wcc-contentful 1.1.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/app/jobs/wcc/contentful/webhook_enable_job.rb +8 -8
- data/lib/wcc/contentful/active_record_shim.rb +2 -2
- data/lib/wcc/contentful/content_type_indexer.rb +2 -0
- data/lib/wcc/contentful/event.rb +2 -8
- data/lib/wcc/contentful/indexed_representation.rb +1 -0
- data/lib/wcc/contentful/middleware/store/caching_middleware.rb +1 -1
- data/lib/wcc/contentful/model.rb +0 -6
- data/lib/wcc/contentful/model_api.rb +16 -9
- data/lib/wcc/contentful/model_builder.rb +3 -0
- data/lib/wcc/contentful/model_singleton_methods.rb +3 -3
- data/lib/wcc/contentful/rich_text/node.rb +62 -0
- data/lib/wcc/contentful/rich_text.rb +105 -0
- data/lib/wcc/contentful/simple_client/response.rb +25 -29
- data/lib/wcc/contentful/store/cdn_adapter.rb +15 -6
- data/lib/wcc/contentful/store/memory_store.rb +47 -13
- data/lib/wcc/contentful/store/query.rb +21 -1
- data/lib/wcc/contentful/store/rspec_examples/basic_store.rb +0 -85
- data/lib/wcc/contentful/store/rspec_examples/operators/eq.rb +92 -0
- data/lib/wcc/contentful/store/rspec_examples/operators/in.rb +131 -0
- data/lib/wcc/contentful/store/rspec_examples/operators/ne.rb +77 -0
- data/lib/wcc/contentful/store/rspec_examples/operators/nin.rb +80 -0
- data/lib/wcc/contentful/store/rspec_examples/operators.rb +50 -0
- data/lib/wcc/contentful/store/rspec_examples.rb +2 -0
- data/lib/wcc/contentful/version.rb +1 -1
- data/lib/wcc/contentful.rb +1 -1
- data/wcc-contentful.gemspec +1 -1
- metadata +13 -7
|
@@ -34,6 +34,17 @@ module WCC::Contentful::Store
|
|
|
34
34
|
@extra = extra
|
|
35
35
|
end
|
|
36
36
|
|
|
37
|
+
FALSE_VALUES = [
|
|
38
|
+
false, 0,
|
|
39
|
+
'0', :"0",
|
|
40
|
+
'f', :f,
|
|
41
|
+
'F', :F,
|
|
42
|
+
'false', :false, # rubocop:disable Lint/BooleanSymbol
|
|
43
|
+
'FALSE', :FALSE,
|
|
44
|
+
'off', :off,
|
|
45
|
+
'OFF', :OFF
|
|
46
|
+
].to_set.freeze
|
|
47
|
+
|
|
37
48
|
# Returns a new chained Query that has a new condition. The new condition
|
|
38
49
|
# represents the WHERE comparison being applied here. The underlying store
|
|
39
50
|
# implementation translates this condition statement into an appropriate
|
|
@@ -50,7 +61,16 @@ module WCC::Contentful::Store
|
|
|
50
61
|
# @expected The expected value to compare the field's value against.
|
|
51
62
|
# @context A context object optionally containing `context[:locale]`
|
|
52
63
|
def apply_operator(operator, field, expected, context = nil)
|
|
64
|
+
operator ||= expected.is_a?(Array) ? :in : :eq
|
|
53
65
|
raise ArgumentError, "Operator #{operator} not supported" unless respond_to?(operator)
|
|
66
|
+
raise ArgumentError, 'value cannot be nil (try using exists: false)' if expected.nil?
|
|
67
|
+
|
|
68
|
+
case operator
|
|
69
|
+
when :in, :nin, :all
|
|
70
|
+
expected = Array(expected)
|
|
71
|
+
when :exists
|
|
72
|
+
expected = !FALSE_VALUES.include?(expected)
|
|
73
|
+
end
|
|
54
74
|
|
|
55
75
|
field = field.to_s if field.is_a? Symbol
|
|
56
76
|
path = field.is_a?(Array) ? field : field.split('.')
|
|
@@ -151,7 +171,7 @@ module WCC::Contentful::Store
|
|
|
151
171
|
elsif op?(k)
|
|
152
172
|
{ path: path, op: k.to_sym, expected: v }
|
|
153
173
|
else
|
|
154
|
-
{ path: path + [k], op:
|
|
174
|
+
{ path: path + [k], op: nil, expected: v }
|
|
155
175
|
end
|
|
156
176
|
end
|
|
157
177
|
end
|
|
@@ -528,68 +528,6 @@ RSpec.shared_examples 'basic store' do
|
|
|
528
528
|
expect(found.dig('sys', 'id')).to eq('idTwo')
|
|
529
529
|
expect(found.dig('fields', 'system', 'en-US')).to eq('Two')
|
|
530
530
|
end
|
|
531
|
-
|
|
532
|
-
[
|
|
533
|
-
[Integer, proc { rand(-4_611_686_018_427_387_903..4_611_686_018_427_387_903) }],
|
|
534
|
-
[Float, proc { rand }]
|
|
535
|
-
].each do |(type, generator)|
|
|
536
|
-
context "by #{type} equality" do
|
|
537
|
-
it 'can apply filter object' do
|
|
538
|
-
data =
|
|
539
|
-
1.upto(10).map do |i|
|
|
540
|
-
{
|
|
541
|
-
'sys' => { 'id' => "k#{i}", 'contentType' => { 'sys' => { 'id' => 'test1' } } },
|
|
542
|
-
'fields' => { type.to_s => { 'en-US' => generator.call } }
|
|
543
|
-
}
|
|
544
|
-
end
|
|
545
|
-
|
|
546
|
-
desired_value = generator.call
|
|
547
|
-
desired = {
|
|
548
|
-
'sys' => { 'id' => "k#{rand}", 'contentType' => { 'sys' => { 'id' => 'test1' } } },
|
|
549
|
-
'fields' => { type.to_s => { 'en-US' => desired_value } }
|
|
550
|
-
}
|
|
551
|
-
|
|
552
|
-
data << desired
|
|
553
|
-
data.shuffle.each { |d| subject.set(d.dig('sys', 'id'), d) }
|
|
554
|
-
|
|
555
|
-
# act
|
|
556
|
-
found = subject.find_by(content_type: 'test1', filter: { type.to_s => desired_value })
|
|
557
|
-
|
|
558
|
-
# assert
|
|
559
|
-
expect(found).to_not be_nil
|
|
560
|
-
expect(found).to eq(desired)
|
|
561
|
-
end
|
|
562
|
-
|
|
563
|
-
it 'filter object can find value in array' do
|
|
564
|
-
data =
|
|
565
|
-
1.upto(10).map do |i|
|
|
566
|
-
{
|
|
567
|
-
'sys' => {
|
|
568
|
-
'id' => "k#{i}",
|
|
569
|
-
'contentType' => { 'sys' => { 'id' => 'test1' } }
|
|
570
|
-
},
|
|
571
|
-
'fields' => { 'name' => { 'en-US' => [generator.call, generator.call] } }
|
|
572
|
-
}
|
|
573
|
-
end
|
|
574
|
-
|
|
575
|
-
desired_value = generator.call
|
|
576
|
-
desired = {
|
|
577
|
-
'sys' => { 'id' => "k#{rand}", 'contentType' => { 'sys' => { 'id' => 'test1' } } },
|
|
578
|
-
'fields' => { type.to_s => { 'en-US' => [generator.call, desired_value].shuffle } }
|
|
579
|
-
}
|
|
580
|
-
|
|
581
|
-
data << desired
|
|
582
|
-
data.shuffle.each { |d| subject.set(d.dig('sys', 'id'), d) }
|
|
583
|
-
|
|
584
|
-
# act
|
|
585
|
-
found = subject.find_by(content_type: 'test1', filter: { type.to_s => { eq: desired_value } })
|
|
586
|
-
|
|
587
|
-
# assert
|
|
588
|
-
expect(found).to_not be_nil
|
|
589
|
-
expect(found).to eq(desired)
|
|
590
|
-
end
|
|
591
|
-
end
|
|
592
|
-
end
|
|
593
531
|
end
|
|
594
532
|
|
|
595
533
|
describe '#find_all' do
|
|
@@ -634,29 +572,6 @@ RSpec.shared_examples 'basic store' do
|
|
|
634
572
|
%w[k1 k5 k9]
|
|
635
573
|
)
|
|
636
574
|
end
|
|
637
|
-
|
|
638
|
-
it 'filter query eq can find value in array' do
|
|
639
|
-
content_types = %w[test1 test2 test3 test4]
|
|
640
|
-
data =
|
|
641
|
-
1.upto(10).map do |i|
|
|
642
|
-
{
|
|
643
|
-
'sys' => {
|
|
644
|
-
'id' => "k#{i}",
|
|
645
|
-
'contentType' => { 'sys' => { 'id' => content_types[i % content_types.length] } }
|
|
646
|
-
},
|
|
647
|
-
'fields' => { 'name' => { 'en-US' => ["test#{i}", "test_2_#{i}"] } }
|
|
648
|
-
}
|
|
649
|
-
end
|
|
650
|
-
data.each { |d| subject.set(d.dig('sys', 'id'), d) }
|
|
651
|
-
|
|
652
|
-
# act
|
|
653
|
-
found = subject.find_all(content_type: 'test2')
|
|
654
|
-
.apply('name' => { eq: 'test_2_5' })
|
|
655
|
-
|
|
656
|
-
# assert
|
|
657
|
-
expect(found.count).to eq(1)
|
|
658
|
-
expect(found.first.dig('sys', 'id')).to eq('k5')
|
|
659
|
-
end
|
|
660
575
|
end
|
|
661
576
|
|
|
662
577
|
def make_link_to(id, link_type = 'Entry')
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
RSpec.shared_examples 'supports :eq operator' do
|
|
4
|
+
[
|
|
5
|
+
[String, proc { "test#{rand(1..10_000)}" }],
|
|
6
|
+
[Integer, proc { rand(-4_611_686_018_427_387_903..4_611_686_018_427_387_903) }],
|
|
7
|
+
[Float, proc { rand }]
|
|
8
|
+
].each do |(type, generator)|
|
|
9
|
+
context "with #{type} value" do
|
|
10
|
+
let(:desired_value) {
|
|
11
|
+
generator.call
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
let(:data) {
|
|
15
|
+
1.upto(3).map do |i|
|
|
16
|
+
{
|
|
17
|
+
'sys' => { 'id' => "k#{i}", 'contentType' => { 'sys' => { 'id' => 'test1' } } },
|
|
18
|
+
'fields' => { type.to_s => { 'en-US' => generator.call } }
|
|
19
|
+
}
|
|
20
|
+
end
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
let(:desired) {
|
|
24
|
+
{
|
|
25
|
+
'sys' => { 'id' => "k#{rand}", 'contentType' => { 'sys' => { 'id' => 'test1' } } },
|
|
26
|
+
'fields' => { type.to_s => { 'en-US' => desired_value } }
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
it 'find_by can apply filter object' do
|
|
31
|
+
[*data, desired].shuffle.each { |d| subject.set(d.dig('sys', 'id'), d) }
|
|
32
|
+
|
|
33
|
+
# act
|
|
34
|
+
found = subject.find_by(content_type: 'test1', filter: { type.to_s => desired_value })
|
|
35
|
+
|
|
36
|
+
# assert
|
|
37
|
+
expect(found).to_not be_nil
|
|
38
|
+
expect(found).to eq(desired)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
it 'find_by can find value in array' do
|
|
42
|
+
data =
|
|
43
|
+
1.upto(3).map do |i|
|
|
44
|
+
{
|
|
45
|
+
'sys' => {
|
|
46
|
+
'id' => "k#{i}",
|
|
47
|
+
'contentType' => { 'sys' => { 'id' => 'test1' } }
|
|
48
|
+
},
|
|
49
|
+
'fields' => { 'name' => { 'en-US' => [generator.call, generator.call] } }
|
|
50
|
+
}
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
desired_value = generator.call
|
|
54
|
+
desired = {
|
|
55
|
+
'sys' => { 'id' => "k#{rand}", 'contentType' => { 'sys' => { 'id' => 'test1' } } },
|
|
56
|
+
'fields' => { type.to_s => { 'en-US' => [generator.call, desired_value].shuffle } }
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
data << desired
|
|
60
|
+
data.shuffle.each { |d| subject.set(d.dig('sys', 'id'), d) }
|
|
61
|
+
|
|
62
|
+
# act
|
|
63
|
+
found = subject.find_by(content_type: 'test1', filter: { type.to_s => { eq: desired_value } })
|
|
64
|
+
|
|
65
|
+
# assert
|
|
66
|
+
expect(found).to_not be_nil
|
|
67
|
+
expect(found).to eq(desired)
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
it 'find_all can apply operator' do
|
|
71
|
+
desired =
|
|
72
|
+
4.upto(5).map do |i|
|
|
73
|
+
{
|
|
74
|
+
'sys' => { 'id' => "k#{i}", 'contentType' => { 'sys' => { 'id' => 'test1' } } },
|
|
75
|
+
'fields' => { type.to_s => { 'en-US' => desired_value } }
|
|
76
|
+
}
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
[*data, *desired].shuffle.each { |d| subject.set(d.dig('sys', 'id'), d) }
|
|
80
|
+
|
|
81
|
+
# act
|
|
82
|
+
found = subject.find_all(content_type: 'test1')
|
|
83
|
+
.eq(type.to_s, desired_value)
|
|
84
|
+
|
|
85
|
+
# assert
|
|
86
|
+
expect(found.count).to eq(2)
|
|
87
|
+
sorted = found.to_a.sort_by { |item| item.dig('sys', 'id') }
|
|
88
|
+
expect(sorted).to eq(desired)
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
end
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
RSpec.shared_examples 'supports :in operator' do
|
|
4
|
+
it 'find_all with array on string field' do
|
|
5
|
+
ids = 1.upto(10).to_a
|
|
6
|
+
data =
|
|
7
|
+
ids.map do |i|
|
|
8
|
+
{
|
|
9
|
+
'sys' => {
|
|
10
|
+
'id' => "k#{i}",
|
|
11
|
+
'contentType' => { 'sys' => { 'id' => 'test' } }
|
|
12
|
+
},
|
|
13
|
+
'fields' => { 'name' => { 'en-US' => "test#{i}" } }
|
|
14
|
+
}
|
|
15
|
+
end
|
|
16
|
+
data.each { |d| subject.set(d.dig('sys', 'id'), d) }
|
|
17
|
+
|
|
18
|
+
to_find = ids.shuffle.take(2)
|
|
19
|
+
|
|
20
|
+
# act
|
|
21
|
+
found = subject.find_all(content_type: 'test')
|
|
22
|
+
.in('name', to_find.map { |i| "test#{i}" })
|
|
23
|
+
|
|
24
|
+
expect(found.count).to eq(2)
|
|
25
|
+
expect(found.map { |item| item.dig('sys', 'id') }.sort).to eq(
|
|
26
|
+
to_find.map { |i| "k#{i}" }.sort
|
|
27
|
+
)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
it 'find_all with array on array field' do
|
|
31
|
+
ids = 1.upto(10).to_a
|
|
32
|
+
data =
|
|
33
|
+
ids.map do |i|
|
|
34
|
+
{
|
|
35
|
+
'sys' => {
|
|
36
|
+
'id' => "k#{i}",
|
|
37
|
+
'contentType' => { 'sys' => { 'id' => 'test' } }
|
|
38
|
+
},
|
|
39
|
+
'fields' => { 'name' => { 'en-US' => ["test#{i}", "test_2_#{i}"] } }
|
|
40
|
+
}
|
|
41
|
+
end
|
|
42
|
+
data.each { |d| subject.set(d.dig('sys', 'id'), d) }
|
|
43
|
+
|
|
44
|
+
to_find1, to_find2 = ids.shuffle
|
|
45
|
+
|
|
46
|
+
# act
|
|
47
|
+
found = subject.find_all(content_type: 'test')
|
|
48
|
+
.in('name', ["test#{to_find1}", "test_2_#{to_find2}"])
|
|
49
|
+
|
|
50
|
+
expect(found.count).to eq(2)
|
|
51
|
+
expect(found.map { |item| item.dig('sys', 'id') }.sort).to eq(
|
|
52
|
+
["k#{to_find1}", "k#{to_find2}"].sort
|
|
53
|
+
)
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
it 'find_all defaults to :in when given an array' do
|
|
57
|
+
ids = 1.upto(10).to_a
|
|
58
|
+
data =
|
|
59
|
+
ids.map do |i|
|
|
60
|
+
{
|
|
61
|
+
'sys' => {
|
|
62
|
+
'id' => "k#{i}",
|
|
63
|
+
'contentType' => { 'sys' => { 'id' => 'test' } }
|
|
64
|
+
},
|
|
65
|
+
'fields' => { 'name' => { 'en-US' => "test#{i}" } }
|
|
66
|
+
}
|
|
67
|
+
end
|
|
68
|
+
data.each { |d| subject.set(d.dig('sys', 'id'), d) }
|
|
69
|
+
|
|
70
|
+
to_find = ids.shuffle.take(3)
|
|
71
|
+
|
|
72
|
+
# act
|
|
73
|
+
found = subject.find_all(content_type: 'test')
|
|
74
|
+
.apply('name' => to_find.map { |i| "test#{i}" })
|
|
75
|
+
|
|
76
|
+
expect(found.count).to eq(3)
|
|
77
|
+
expect(found.map { |item| item.dig('sys', 'id') }.sort).to eq(
|
|
78
|
+
to_find.map { |i| "k#{i}" }.sort
|
|
79
|
+
)
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
it 'find_by with array on string field' do
|
|
83
|
+
ids = 1.upto(10).to_a
|
|
84
|
+
data =
|
|
85
|
+
ids.map do |i|
|
|
86
|
+
{
|
|
87
|
+
'sys' => {
|
|
88
|
+
'id' => "k#{i}",
|
|
89
|
+
'contentType' => { 'sys' => { 'id' => 'test' } }
|
|
90
|
+
},
|
|
91
|
+
'fields' => { 'name' => { 'en-US' => "test#{i}" } }
|
|
92
|
+
}
|
|
93
|
+
end
|
|
94
|
+
data.each { |d| subject.set(d.dig('sys', 'id'), d) }
|
|
95
|
+
|
|
96
|
+
to_find = ids.sample
|
|
97
|
+
|
|
98
|
+
# act
|
|
99
|
+
found = subject.find_by(
|
|
100
|
+
content_type: 'test',
|
|
101
|
+
filter: { name: { in: ['asdf', "test#{to_find}"] } }
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
expect(found.dig('sys', 'id')).to eq("k#{to_find}")
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
it 'find_by defaults to :in when given an array' do
|
|
108
|
+
ids = 1.upto(10).to_a
|
|
109
|
+
data =
|
|
110
|
+
ids.map do |i|
|
|
111
|
+
{
|
|
112
|
+
'sys' => {
|
|
113
|
+
'id' => "k#{i}",
|
|
114
|
+
'contentType' => { 'sys' => { 'id' => 'test' } }
|
|
115
|
+
},
|
|
116
|
+
'fields' => { 'name' => { 'en-US' => "test#{i}" } }
|
|
117
|
+
}
|
|
118
|
+
end
|
|
119
|
+
data.each { |d| subject.set(d.dig('sys', 'id'), d) }
|
|
120
|
+
|
|
121
|
+
to_find = ids.sample
|
|
122
|
+
|
|
123
|
+
# act
|
|
124
|
+
found = subject.find_by(
|
|
125
|
+
content_type: 'test',
|
|
126
|
+
filter: { name: ['asdf', "test#{to_find}"] }
|
|
127
|
+
)
|
|
128
|
+
|
|
129
|
+
expect(found.dig('sys', 'id')).to eq("k#{to_find}")
|
|
130
|
+
end
|
|
131
|
+
end
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
RSpec.shared_examples 'supports :ne operator' do
|
|
4
|
+
[
|
|
5
|
+
[String, proc { "test#{rand(1..100_000)}" }],
|
|
6
|
+
[Integer, proc { rand(-4_611_686_018_427_387_903..4_611_686_018_427_387_903) }],
|
|
7
|
+
[Float, proc { rand }]
|
|
8
|
+
].each do |(type, generator)|
|
|
9
|
+
context "with #{type} value" do
|
|
10
|
+
let(:specified_value) {
|
|
11
|
+
generator.call
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
let(:desired) {
|
|
15
|
+
# desired entry doesn't have the specified_value
|
|
16
|
+
{
|
|
17
|
+
'sys' => { 'id' => "k#{rand}", 'contentType' => { 'sys' => { 'id' => 'test1' } } },
|
|
18
|
+
'fields' => { type.to_s => { 'en-US' => 1.upto(rand(2..5)).map { generator.call } } }
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
let(:data) {
|
|
23
|
+
1.upto(3).map do |i|
|
|
24
|
+
random_values = 1.upto(rand(2..5)).map { generator.call }
|
|
25
|
+
|
|
26
|
+
# remaining data does include the specified_value
|
|
27
|
+
{
|
|
28
|
+
'sys' => {
|
|
29
|
+
'id' => "k#{i}",
|
|
30
|
+
'contentType' => { 'sys' => { 'id' => 'test1' } }
|
|
31
|
+
},
|
|
32
|
+
'fields' => { type.to_s => { 'en-US' => [*random_values, specified_value].shuffle } }
|
|
33
|
+
}
|
|
34
|
+
end
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
it 'find_by can apply filter object' do
|
|
38
|
+
specified_value = generator.call
|
|
39
|
+
data = {
|
|
40
|
+
'sys' => { 'id' => "k#{rand}", 'contentType' => { 'sys' => { 'id' => 'test1' } } },
|
|
41
|
+
'fields' => { type.to_s => { 'en-US' => specified_value } }
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
subject.set(data.dig('sys', 'id'), data)
|
|
45
|
+
|
|
46
|
+
# act
|
|
47
|
+
found = subject.find_by(content_type: 'test1', filter: { type.to_s => { ne: specified_value } })
|
|
48
|
+
|
|
49
|
+
# assert
|
|
50
|
+
expect(found).to be_nil
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
it 'find_by can find value in array' do
|
|
54
|
+
[*data, desired].shuffle.each { |d| subject.set(d.dig('sys', 'id'), d) }
|
|
55
|
+
|
|
56
|
+
# act
|
|
57
|
+
found = subject.find_by(content_type: 'test1', filter: { type.to_s => { ne: specified_value } })
|
|
58
|
+
|
|
59
|
+
# assert
|
|
60
|
+
expect(found).to_not be_nil
|
|
61
|
+
expect(found).to eq(desired)
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
it 'find_all can apply operator' do
|
|
65
|
+
[*data, desired].shuffle.each { |d| subject.set(d.dig('sys', 'id'), d) }
|
|
66
|
+
|
|
67
|
+
# act
|
|
68
|
+
found = subject.find_all(content_type: 'test1')
|
|
69
|
+
.ne(type.to_s, specified_value)
|
|
70
|
+
|
|
71
|
+
# assert
|
|
72
|
+
expect(found.count).to eq(1)
|
|
73
|
+
expect(found.first).to eq(desired)
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
end
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
RSpec.shared_examples 'supports :nin operator' do
|
|
4
|
+
it 'find_all with array on string field' do
|
|
5
|
+
ids = 1.upto(10).to_a
|
|
6
|
+
data =
|
|
7
|
+
ids.map do |i|
|
|
8
|
+
{
|
|
9
|
+
'sys' => {
|
|
10
|
+
'id' => "k#{i}",
|
|
11
|
+
'contentType' => { 'sys' => { 'id' => 'test' } }
|
|
12
|
+
},
|
|
13
|
+
'fields' => { 'name' => { 'en-US' => "test#{i}" } }
|
|
14
|
+
}
|
|
15
|
+
end
|
|
16
|
+
data.each { |d| subject.set(d.dig('sys', 'id'), d) }
|
|
17
|
+
|
|
18
|
+
to_exclude = ids.shuffle.take(2)
|
|
19
|
+
|
|
20
|
+
# act
|
|
21
|
+
found = subject.find_all(content_type: 'test')
|
|
22
|
+
.nin('name', to_exclude.map { |i| "test#{i}" })
|
|
23
|
+
|
|
24
|
+
expect(found.count).to eq(8)
|
|
25
|
+
expect(found.map { |item| item.dig('sys', 'id') }.sort).to eq(
|
|
26
|
+
(ids - to_exclude).map { |i| "k#{i}" }.sort
|
|
27
|
+
)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
it 'find_all with array on array field' do
|
|
31
|
+
ids = 1.upto(10).to_a
|
|
32
|
+
data =
|
|
33
|
+
ids.map do |i|
|
|
34
|
+
{
|
|
35
|
+
'sys' => {
|
|
36
|
+
'id' => "k#{i}",
|
|
37
|
+
'contentType' => { 'sys' => { 'id' => 'test' } }
|
|
38
|
+
},
|
|
39
|
+
'fields' => { 'name' => { 'en-US' => ["test#{i}", "test_2_#{i}"] } }
|
|
40
|
+
}
|
|
41
|
+
end
|
|
42
|
+
data.each { |d| subject.set(d.dig('sys', 'id'), d) }
|
|
43
|
+
|
|
44
|
+
to_exclude1, to_exclude2 = ids.shuffle
|
|
45
|
+
|
|
46
|
+
# act
|
|
47
|
+
found = subject.find_all(content_type: 'test')
|
|
48
|
+
.nin('name', ["test#{to_exclude1}", "test_2_#{to_exclude2}"])
|
|
49
|
+
|
|
50
|
+
expect(found.count).to eq(8)
|
|
51
|
+
expect(found.map { |item| item.dig('sys', 'id') }.sort).to eq(
|
|
52
|
+
(ids - [to_exclude1, to_exclude2]).map { |i| "k#{i}" }.sort
|
|
53
|
+
)
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
it 'find_by with array on string field' do
|
|
57
|
+
ids = 1.upto(2).to_a
|
|
58
|
+
data =
|
|
59
|
+
ids.map do |i|
|
|
60
|
+
{
|
|
61
|
+
'sys' => {
|
|
62
|
+
'id' => "k#{i}",
|
|
63
|
+
'contentType' => { 'sys' => { 'id' => 'test' } }
|
|
64
|
+
},
|
|
65
|
+
'fields' => { 'name' => { 'en-US' => "test#{i}" } }
|
|
66
|
+
}
|
|
67
|
+
end
|
|
68
|
+
data.each { |d| subject.set(d.dig('sys', 'id'), d) }
|
|
69
|
+
|
|
70
|
+
to_exclude, to_expect = ids.shuffle
|
|
71
|
+
|
|
72
|
+
# act
|
|
73
|
+
found = subject.find_by(
|
|
74
|
+
content_type: 'test',
|
|
75
|
+
filter: { name: { nin: ['asdf', "test#{to_exclude}"] } }
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
expect(found.dig('sys', 'id')).to eq("k#{to_expect}")
|
|
79
|
+
end
|
|
80
|
+
end
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative './operators/eq'
|
|
4
|
+
require_relative './operators/ne'
|
|
5
|
+
require_relative './operators/in'
|
|
6
|
+
require_relative './operators/nin'
|
|
7
|
+
|
|
8
|
+
(WCC::Contentful::Store::Query::Interface::OPERATORS -
|
|
9
|
+
%i[eq ne in nin]).each do |op|
|
|
10
|
+
RSpec.shared_examples "supports :#{op} operator" do
|
|
11
|
+
it 'TODO'
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
RSpec.shared_examples 'operators' do |feature_set|
|
|
16
|
+
supported_operators =
|
|
17
|
+
if feature_set.nil?
|
|
18
|
+
WCC::Contentful::Store::Query::Interface::OPERATORS
|
|
19
|
+
.each_with_object({}) { |k, h| h[k] = 'pending' }
|
|
20
|
+
elsif feature_set.is_a?(Array)
|
|
21
|
+
WCC::Contentful::Store::Query::Interface::OPERATORS
|
|
22
|
+
.each_with_object({}) { |k, h| h[k] = feature_set.include?(k.to_sym) }
|
|
23
|
+
elsif feature_s.is_a?(Hash)
|
|
24
|
+
feature_set
|
|
25
|
+
else
|
|
26
|
+
raise ArgumentError, 'Please provide a hash or array of operators to test'
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
supported_operators.each do |op, value|
|
|
30
|
+
next if value
|
|
31
|
+
|
|
32
|
+
it "does not support :#{op}" do
|
|
33
|
+
expect {
|
|
34
|
+
subject.find_all(content_type: 'test')
|
|
35
|
+
.apply('name' => { op => 'test' })
|
|
36
|
+
.to_a
|
|
37
|
+
}.to raise_error do |ex|
|
|
38
|
+
expect(ex.to_s).to match(/not supported/)
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
supported_operators.each do |op, value|
|
|
44
|
+
next unless value
|
|
45
|
+
|
|
46
|
+
it_behaves_like "supports :#{op} operator" do
|
|
47
|
+
before { pending(":#{op} operator to be implemented") } if value == 'pending'
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
require_relative './rspec_examples/basic_store'
|
|
4
|
+
require_relative './rspec_examples/operators'
|
|
4
5
|
require_relative './rspec_examples/nested_queries'
|
|
5
6
|
require_relative './rspec_examples/include_param'
|
|
6
7
|
|
|
@@ -41,6 +42,7 @@ RSpec.shared_examples 'contentful store' do |feature_set|
|
|
|
41
42
|
}.merge(feature_set&.symbolize_keys || {})
|
|
42
43
|
|
|
43
44
|
include_examples 'basic store'
|
|
45
|
+
include_examples 'operators', feature_set[:operators]
|
|
44
46
|
include_examples 'supports nested queries', feature_set[:nested_queries]
|
|
45
47
|
include_examples 'supports include param', feature_set[:include_param]
|
|
46
48
|
end
|
data/lib/wcc/contentful.rb
CHANGED
data/wcc-contentful.gemspec
CHANGED
|
@@ -54,7 +54,7 @@ Gem::Specification.new do |spec|
|
|
|
54
54
|
spec.add_development_dependency 'generator_spec', '~> 0.9.4'
|
|
55
55
|
# spec.add_development_dependency 'rails', '~> 5.0'
|
|
56
56
|
# spec.add_development_dependency 'rspec-rails', '~> 3.7'
|
|
57
|
-
spec.add_development_dependency 'sqlite3', '~> 1.
|
|
57
|
+
spec.add_development_dependency 'sqlite3', '~> 1.4'
|
|
58
58
|
spec.add_development_dependency 'timecop', '~> 0.9.1'
|
|
59
59
|
|
|
60
60
|
# optional dependencies
|