redis_counters 1.3.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.
Files changed (37) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +21 -0
  3. data/CHANGELOG.md +38 -0
  4. data/Gemfile +3 -0
  5. data/Makefile +14 -0
  6. data/README.md +320 -0
  7. data/Rakefile +15 -0
  8. data/lib/redis_counters.rb +21 -0
  9. data/lib/redis_counters/base_counter.rb +84 -0
  10. data/lib/redis_counters/bucket.rb +59 -0
  11. data/lib/redis_counters/cluster.rb +22 -0
  12. data/lib/redis_counters/clusterize_and_partitionize.rb +194 -0
  13. data/lib/redis_counters/hash_counter.rb +70 -0
  14. data/lib/redis_counters/partition.rb +16 -0
  15. data/lib/redis_counters/unique_hash_counter.rb +51 -0
  16. data/lib/redis_counters/unique_values_lists/base.rb +57 -0
  17. data/lib/redis_counters/unique_values_lists/blocking.rb +167 -0
  18. data/lib/redis_counters/unique_values_lists/expirable.rb +155 -0
  19. data/lib/redis_counters/unique_values_lists/non_blocking.rb +91 -0
  20. data/lib/redis_counters/version.rb +3 -0
  21. data/redis_counters.gemspec +31 -0
  22. data/spec/redis_counters/base_spec.rb +29 -0
  23. data/spec/redis_counters/hash_counter_spec.rb +462 -0
  24. data/spec/redis_counters/unique_hash_counter_spec.rb +83 -0
  25. data/spec/redis_counters/unique_values_lists/blocking_spec.rb +94 -0
  26. data/spec/redis_counters/unique_values_lists/expirable_spec.rb +6 -0
  27. data/spec/redis_counters/unique_values_lists/non_blicking_spec.rb +6 -0
  28. data/spec/spec_helper.rb +24 -0
  29. data/spec/support/unique_values_lists/common.rb +563 -0
  30. data/spec/support/unique_values_lists/expirable.rb +162 -0
  31. data/spec/support/unique_values_lists/set.rb +119 -0
  32. data/tasks/audit.rake +6 -0
  33. data/tasks/cane.rake +12 -0
  34. data/tasks/changelog.rake +7 -0
  35. data/tasks/coverage.rake +21 -0
  36. data/tasks/support.rb +24 -0
  37. metadata +242 -0
@@ -0,0 +1,83 @@
1
+ require 'spec_helper'
2
+
3
+ describe RedisCounters::UniqueHashCounter do
4
+ let(:redis) { MockRedis.new }
5
+ let(:unique_list_postfix) { described_class.const_get(:UNIQUE_LIST_POSTFIX) }
6
+
7
+ let(:options) { {
8
+ :counter_name => :test_counter,
9
+ :field_name => :test_field,
10
+ :unique_list => { :list_class => RedisCounters::UniqueValuesLists::Blocking }
11
+ } }
12
+
13
+ let(:counter) { described_class.new(redis, options) }
14
+
15
+ context '#partitions' do
16
+ let(:options) { {
17
+ :counter_name => :visits_by_day,
18
+ :field_name => 'dd',
19
+ :partition_keys => [:date],
20
+ :unique_list => {
21
+ :list_class => RedisCounters::UniqueValuesLists::NonBlocking,
22
+ :value_keys => [:sid],
23
+ :cluster_keys => [:p1],
24
+ :partition_keys => [:p2]
25
+ }
26
+ } }
27
+
28
+ before { counter.process(:date => '2013-10-17', :p1 => '2', :p2 => '3', :sid => '1') }
29
+
30
+ it { expect(counter.partitions).to have(1).partitions }
31
+ it { expect(counter.partitions.first).to include ({:date => '2013-10-17'}) }
32
+ end
33
+
34
+ it { expect(counter).to be_a_kind_of RedisCounters::HashCounter }
35
+
36
+ context 'when unique_list not given' do
37
+ let(:options) { {
38
+ :counter_name => :test_counter,
39
+ :field_name => :test_field
40
+ } }
41
+
42
+ it { expect { counter.process }.to raise_error KeyError }
43
+ end
44
+
45
+ context 'when only partition_keys and partition_keys given' do
46
+ let(:options) { {
47
+ :counter_name => :test_counter,
48
+ :field_name => :test_field,
49
+ :group_keys => [:param1],
50
+ :partition_keys => [:date],
51
+ :unique_list => {
52
+ :list_class => RedisCounters::UniqueValuesLists::Blocking,
53
+ :value_keys => [:sid],
54
+ :cluster_keys => [:param2],
55
+ :partition_keys => [:date]
56
+ }
57
+ } }
58
+
59
+ before { 2.times { counter.process(:param1 => 1, :param2 => 2, :date => '2013-04-27', :sid => 1) } }
60
+ before { 2.times { counter.process(:param1 => 1, :param2 => 2, :date => '2013-04-27', :sid => 2) } }
61
+ before { 2.times { counter.process(:param1 => 2, :param2 => 2, :date => '2013-04-27', :sid => 3) } }
62
+ before { 2.times { counter.process(:param1 => 2, :param2 => 1, :date => '2013-04-28', :sid => 1) } }
63
+ before { 2.times { counter.process(:param1 => 2, :param2 => 1, :date => '2013-04-28', :sid => 5) } }
64
+ before { 2.times { counter.process(:param1 => 2, :param2 => 1, :date => '2013-04-27', :sid => 4) } }
65
+ before { 2.times { counter.process(:param1 => 2, :param2 => 1, :date => '2013-04-27', :sid => 1) } }
66
+ before { 2.times { counter.process(:param1 => 2, :param2 => 1, :date => '2013-04-28', :sid => 4) } }
67
+ before { 2.times { counter.process(:param1 => 2, :param2 => 1, :date => '2013-04-28', :sid => 4) } }
68
+ before { 2.times { counter.process(:param1 => 2, :param2 => 1, :date => '2013-04-27', :sid => 5) } }
69
+
70
+ it { expect(redis.keys('*')).to have(7).key }
71
+
72
+ it { expect(redis.keys('*')).to include 'test_counter:2013-04-27' }
73
+ it { expect(redis.hget('test_counter:2013-04-27', '1')).to eq 2.to_s }
74
+ it { expect(redis.hget('test_counter:2013-04-27', '2')).to eq 2.to_s }
75
+ it { expect(redis.hget('test_counter:2013-04-28', '2')).to eq 2.to_s }
76
+
77
+ it { expect(redis.lrange('test_counter_uq:1:partitions', 0, -1)).to eq ['2013-04-28', '2013-04-27'] }
78
+ it { expect(redis.lrange('test_counter_uq:2:partitions', 0, -1)).to eq ['2013-04-27'] }
79
+ it { expect(redis.smembers('test_counter_uq:1:2013-04-27')).to eq ['4'] }
80
+ it { expect(redis.smembers('test_counter_uq:2:2013-04-27')).to eq ['3', '2', '1'] }
81
+ it { expect(redis.smembers('test_counter_uq:1:2013-04-28')).to eq ['5', '1'] }
82
+ end
83
+ end
@@ -0,0 +1,94 @@
1
+ require 'spec_helper'
2
+
3
+ describe RedisCounters::UniqueValuesLists::Blocking do
4
+ it_behaves_like 'unique_values_lists/common'
5
+ it_behaves_like 'unique_values_lists/set'
6
+
7
+ context 'when check partitions list' do
8
+ let(:redis) { MockRedis.new }
9
+ let(:values) { rand(10) + 1 }
10
+ let(:partitions_list_postfix) { described_class.const_get(:PARTITIONS_LIST_POSTFIX) }
11
+
12
+ let(:counter) { described_class.new(redis, options) }
13
+
14
+ context 'when group and partition keys given' do
15
+ let(:options) { {
16
+ :counter_name => :test_counter,
17
+ :value_keys => [:param0, :param1],
18
+ :cluster_keys => [:param2],
19
+ :partition_keys => [:param3, :param4]
20
+ } }
21
+
22
+ before { values.times { counter.process(:param0 => 1, :param1 => 2, :param2 => :cluster1, :param3 => :part1, :param4 => :part2) } }
23
+ before { values.times { counter.process(:param0 => 2, :param1 => 1, :param2 => :cluster1, :param3 => :part1, :param4 => :part2) } }
24
+ before { values.times { counter.process(:param0 => 3, :param1 => 2, :param2 => :cluster1, :param3 => :part2, :param4 => :part2) } }
25
+ before { values.times { counter.process(:param0 => 4, :param1 => 5, :param2 => :cluster2, :param3 => :part1, :param4 => :part2) } }
26
+
27
+ it { expect(redis.keys('*')).to have(5).key }
28
+
29
+ context 'when check partitions' do
30
+ it { expect(redis.lrange("test_counter:cluster1:#{partitions_list_postfix}", 0, -1)).to be_true }
31
+ it { expect(redis.lrange("test_counter:cluster2:#{partitions_list_postfix}", 0, -1)).to be_true }
32
+
33
+ it { expect(redis.lrange("test_counter:cluster1:#{partitions_list_postfix}", 0, -1)).to have(2).keys }
34
+ it { expect(redis.lrange("test_counter:cluster2:#{partitions_list_postfix}", 0, -1)).to have(1).keys }
35
+
36
+ it { expect(redis.lrange("test_counter:cluster1:#{partitions_list_postfix}", 0, -1)).to include 'part1:part2' }
37
+ it { expect(redis.lrange("test_counter:cluster1:#{partitions_list_postfix}", 0, -1)).to include 'part2:part2' }
38
+ it { expect(redis.lrange("test_counter:cluster2:#{partitions_list_postfix}", 0, -1)).to include 'part1:part2' }
39
+ end
40
+
41
+ context 'when check values' do
42
+ it { expect(redis.exists("test_counter:cluster1:part1:part2")).to be_true }
43
+ it { expect(redis.exists("test_counter:cluster1:part2:part2")).to be_true }
44
+ it { expect(redis.exists("test_counter:cluster2:part1:part2")).to be_true }
45
+
46
+ it { expect(redis.smembers("test_counter:cluster1:part1:part2")).to have(2).keys }
47
+ it { expect(redis.smembers("test_counter:cluster1:part2:part2")).to have(1).keys }
48
+ it { expect(redis.smembers("test_counter:cluster2:part1:part2")).to have(1).keys }
49
+
50
+ it { expect(redis.smembers("test_counter:cluster1:part1:part2")).to include '1:2' }
51
+ it { expect(redis.smembers("test_counter:cluster1:part1:part2")).to include '2:1' }
52
+ it { expect(redis.smembers("test_counter:cluster1:part2:part2")).to include '3:2' }
53
+ it { expect(redis.smembers("test_counter:cluster2:part1:part2")).to include '4:5' }
54
+ end
55
+ end
56
+
57
+ context 'when no cluster keys given, but partition keys given' do
58
+ let(:options) { {
59
+ :counter_name => :test_counter,
60
+ :value_keys => [:param0, :param1],
61
+ :partition_keys => [:param3, :param4]
62
+ } }
63
+
64
+ before { values.times { counter.process(:param0 => 1, :param1 => 2, :param3 => :part1, :param4 => :part2) } }
65
+ before { values.times { counter.process(:param0 => 2, :param1 => 1, :param3 => :part1, :param4 => :part2) } }
66
+ before { values.times { counter.process(:param0 => 3, :param1 => 2, :param3 => :part2, :param4 => :part2) } }
67
+ before { values.times { counter.process(:param0 => 4, :param1 => 5, :param3 => :part1, :param4 => :part2) } }
68
+
69
+ it { expect(redis.keys('*')).to have(3).key }
70
+
71
+ context 'when check partitions' do
72
+ it { expect(redis.exists("test_counter:#{partitions_list_postfix}")).to be_true }
73
+
74
+ it { expect(redis.lrange("test_counter:#{partitions_list_postfix}", 0, -1)).to have(2).keys }
75
+
76
+ it { expect(redis.lrange("test_counter:#{partitions_list_postfix}", 0, -1)).to include 'part1:part2' }
77
+ it { expect(redis.lrange("test_counter:#{partitions_list_postfix}", 0, -1)).to include 'part2:part2' }
78
+ end
79
+
80
+ context 'when check values' do
81
+ it { expect(redis.exists("test_counter:part1:part2")).to be_true }
82
+ it { expect(redis.exists("test_counter:part2:part2")).to be_true }
83
+
84
+ it { expect(redis.smembers("test_counter:part1:part2")).to have(3).keys }
85
+ it { expect(redis.smembers("test_counter:part2:part2")).to have(1).keys }
86
+
87
+ it { expect(redis.smembers("test_counter:part1:part2")).to include '1:2' }
88
+ it { expect(redis.smembers("test_counter:part1:part2")).to include '2:1' }
89
+ it { expect(redis.smembers("test_counter:part2:part2")).to include '3:2' }
90
+ it { expect(redis.smembers("test_counter:part1:part2")).to include '4:5' }
91
+ end
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,6 @@
1
+ require 'spec_helper'
2
+
3
+ describe RedisCounters::UniqueValuesLists::Expirable do
4
+ it_behaves_like 'unique_values_lists/common'
5
+ it_behaves_like 'unique_values_lists/expirable'
6
+ end
@@ -0,0 +1,6 @@
1
+ require 'spec_helper'
2
+
3
+ describe RedisCounters::UniqueValuesLists::NonBlocking do
4
+ it_behaves_like 'unique_values_lists/common'
5
+ it_behaves_like 'unique_values_lists/set'
6
+ end
@@ -0,0 +1,24 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+ require 'rspec'
4
+ require 'mock_redis'
5
+ require 'timecop'
6
+
7
+ require 'codeclimate-test-reporter'
8
+ CodeClimate::TestReporter.start
9
+
10
+ require 'simplecov'
11
+ SimpleCov.start('test_frameworks')
12
+
13
+ require 'redis_counters'
14
+
15
+ # require helpers
16
+ support_dir = File.expand_path(File.join('..', 'support'), __FILE__)
17
+ Dir[File.join(support_dir, '**', '*.rb')].each { |f| require f }
18
+
19
+ RSpec.configure do |config|
20
+ config.backtrace_exclusion_patterns = [/lib\/rspec\/(core|expectations|matchers|mocks)/]
21
+ config.color_enabled = true
22
+ config.formatter = 'documentation'
23
+ config.order = 'random'
24
+ end
@@ -0,0 +1,563 @@
1
+ # coding: utf-8
2
+ shared_examples_for 'unique_values_lists/common' do
3
+ let(:redis) { MockRedis.new }
4
+ let(:values) { rand(10) + 1 }
5
+
6
+ let(:options) { {
7
+ :counter_name => :test_counter,
8
+ :value_keys => [:param0]
9
+ } }
10
+
11
+ let(:counter) { described_class.new(redis, options) }
12
+
13
+ context '#add' do
14
+ context 'when value_keys not given' do
15
+ let(:options) { {:counter_name => :test_counter} }
16
+
17
+ it { expect { counter.add }.to raise_error KeyError }
18
+ end
19
+
20
+ context 'when unknown value_key given' do
21
+ let(:options) { {
22
+ :counter_name => :test_counter,
23
+ :value_keys => [:param0, :param1]
24
+ } }
25
+
26
+ it { expect { counter.add(:param1 => 1) }.to raise_error KeyError }
27
+ end
28
+
29
+ context 'when unknown cluster_key given' do
30
+ let(:options) { {
31
+ :counter_name => :test_counter,
32
+ :value_keys => [:param0],
33
+ :cluster_keys => [:param1, :param2],
34
+ } }
35
+
36
+ it { expect { counter.add(:param0 => 1, :param1 => 2) }.to raise_error KeyError }
37
+ end
38
+
39
+ context 'when unknown partition_key given' do
40
+ let(:options) { {
41
+ :counter_name => :test_counter,
42
+ :value_keys => [:param0],
43
+ :partition_keys => [:param1, :param2],
44
+ } }
45
+
46
+ it { expect { counter.add(:param0 => 1, :param1 => 2) }.to raise_error KeyError }
47
+ end
48
+
49
+ context 'when block given' do
50
+ let(:options) { {
51
+ :counter_name => :test_counter,
52
+ :value_keys => [:param0]
53
+ } }
54
+
55
+ context 'when item added' do
56
+ it { expect { |b| counter.add(:param0 => 1, &b) }.to yield_with_args(redis) }
57
+ it { expect(counter.add(:param0 => 1)).to be_true }
58
+ end
59
+
60
+ context 'when item not added' do
61
+ before { counter.add(:param0 => 1) }
62
+
63
+ it { expect { |b| counter.add(:param0 => 1, &b) }.to_not yield_with_args(redis) }
64
+ it { expect(counter.add(:param0 => 1)).to be_false }
65
+ end
66
+ end
67
+ end
68
+
69
+ context '#has_value?' do
70
+ context 'when cluster keys given and partition keys given' do
71
+ let(:options) { {
72
+ :counter_name => :test_counter,
73
+ :value_keys => [:param0],
74
+ :cluster_keys => [:cluster],
75
+ :partition_keys => [:part]
76
+ } }
77
+
78
+ let(:cluster1) { {:cluster => :cluster1} }
79
+ let(:cluster2) { {:cluster => :cluster2} }
80
+
81
+ before { values.times { counter.add(:param0 => 1, :cluster => :cluster1, :part => :part1) } }
82
+ before { values.times { counter.add(:param0 => 2, :cluster => :cluster2, :part => :part2) } }
83
+
84
+ it { expect(counter.has_value?(cluster1.merge(:param0 => 1))).to be_true }
85
+ it { expect(counter.has_value?(cluster1.merge(:param0 => 2))).to be_false }
86
+ it { expect(counter.has_value?(cluster2.merge(:param0 => 1))).to be_false }
87
+ it { expect(counter.has_value?(cluster2.merge(:param0 => 2))).to be_true }
88
+ end
89
+
90
+ # check no cluster raise
91
+ # check unknown cluster raise
92
+ end
93
+
94
+ context '#partitions' do
95
+ let(:cluster1_subcluster1) { {:cluster => :cluster1, :subcluster => :subcluster1} }
96
+ let(:cluster1_subcluster2) { {:cluster => :cluster1, :subcluster => :subcluster2} }
97
+ let(:cluster1_subcluster3) { {:cluster => :cluster1, :subcluster => :subcluster3} }
98
+ let(:cluster2_subcluster1) { {:cluster => :cluster2, :subcluster => :subcluster1} }
99
+
100
+ let(:part1_subpart1) { {:part => 'part1', :subpart => 'subpart1'}.with_indifferent_access }
101
+ let(:part1_subpart2) { {:part => 'part1', :subpart => 'subpart2'}.with_indifferent_access }
102
+ let(:part2_subpart1) { {'part' => 'part2', :subpart => 'subpart1'}.with_indifferent_access }
103
+
104
+ context 'when cluster and partition keys given' do
105
+ let(:options) { {
106
+ :counter_name => :test_counter,
107
+ :value_keys => [:param0, :param1],
108
+ :cluster_keys => [:cluster, :subcluster],
109
+ :partition_keys => [:part, :subpart]
110
+ } }
111
+
112
+ # 2 разных знач в одном кластере и партиции
113
+ before { values.times { counter.add(:param0 => 1, :param1 => 2, :cluster => :cluster1, :subcluster => :subcluster1, :part => :part1, :subpart => :subpart1) } }
114
+ before { values.times { counter.add(:param0 => 1, :param1 => 3, :cluster => :cluster1, :subcluster => :subcluster1, :part => :part1, :subpart => :subpart1) } }
115
+ # дубль знач в другой партиции
116
+ before { values.times { counter.add(:param0 => 1, :param1 => 2, :cluster => :cluster1, :subcluster => :subcluster1, :part => :part1, :subpart => :subpart3) } }
117
+ # дубль знач в другом кластере
118
+ before { values.times { counter.add(:param0 => 1, :param1 => 2, :cluster => :cluster1, :subcluster => :subcluster3, :part => :part1, :subpart => :subpart1) } }
119
+ # новое значение в новой подпартиции
120
+ before { values.times { counter.add(:param0 => 3, :param1 => 4, :cluster => :cluster1, :subcluster => :subcluster1, :part => :part1, :subpart => :subpart2) } }
121
+ # новое значение в новой партиции
122
+ before { values.times { counter.add(:param0 => 4, :param1 => 5, :cluster => :cluster1, :subcluster => :subcluster1, :part => :part2, :subpart => :subpart1) } }
123
+ # новое значение в новом кластере
124
+ before { values.times { counter.add(:param0 => 5, :param1 => 6, :cluster => :cluster2, :subcluster => :subcluster1, :part => :part1, :subpart => :subpart1) } }
125
+ # новое значение в новом подкластере
126
+ before { values.times { counter.add(:param0 => 6, :param1 => 7, :cluster => :cluster1, :subcluster => :subcluster2, :part => :part1, :subpart => :subpart1) } }
127
+
128
+ context 'when no cluster given' do
129
+ it { expect { counter.partitions }.to raise_error ArgumentError }
130
+ end
131
+
132
+ context 'when no leaf cluster given' do
133
+ it { expect { counter.partitions(:cluster => :cluster1) }.to raise_error KeyError }
134
+ end
135
+
136
+ context 'when unknown cluster given' do
137
+ it { expect(counter.partitions({:cluster => :unknown_cluster, :subcluster => :subcluster})).to have(0).partitions }
138
+ end
139
+
140
+ context 'when no partition given' do
141
+ it { expect(counter.partitions(cluster1_subcluster1)).to have(3).partitions }
142
+ it { expect(counter.partitions(cluster1_subcluster1).first).to eq part1_subpart1 }
143
+ it { expect(counter.partitions(cluster1_subcluster1).second).to eq part1_subpart2 }
144
+ it { expect(counter.partitions(cluster1_subcluster1).third).to eq part2_subpart1 }
145
+ #
146
+ it { expect(counter.partitions(cluster2_subcluster1)).to have(1).partitions }
147
+ it { expect(counter.partitions(cluster2_subcluster1).first).to eq part1_subpart1 }
148
+ end
149
+
150
+ context 'when not leaf partition given' do
151
+ it { expect(counter.partitions(cluster1_subcluster1.merge(:part => :part1))).to have(2).partitions }
152
+ it { expect(counter.partitions(cluster1_subcluster1.merge(:part => :part1)).first).to eq part1_subpart1 }
153
+ it { expect(counter.partitions(cluster1_subcluster1.merge(:part => :part1)).second).to eq part1_subpart2 }
154
+ end
155
+
156
+ context 'when leaf partition given' do
157
+ it { expect(counter.partitions(cluster1_subcluster1.merge(:part => :part1, 'subpart' => 'subpart1'))).to have(1).partitions }
158
+ it { expect(counter.partitions(cluster1_subcluster1.merge(:part => :part1, 'subpart' => 'subpart1')).first).to eq part1_subpart1 }
159
+ end
160
+ end
161
+
162
+ context 'when not cluster keys given and partition keys given' do
163
+ let(:options) { {
164
+ :counter_name => :test_counter,
165
+ :value_keys => [:param0, :param1],
166
+ :partition_keys => [:part, :subpart]
167
+ } }
168
+
169
+ # 2 разных знач в одной партиции
170
+ before { values.times { counter.add(:param0 => 1, :param1 => 2, :part => :part1, :subpart => :subpart1) } }
171
+ before { values.times { counter.add(:param0 => 1, :param1 => 3, :part => :part1, :subpart => :subpart1) } }
172
+ # дубль знач в другой партиции
173
+ before { values.times { counter.add(:param0 => 1, :param1 => 2, :part => :part1, :subpart => :subpart3) } }
174
+ # новое значение в новой подпартиции
175
+ before { values.times { counter.add(:param0 => 3, :param1 => 4, :part => :part1, :subpart => :subpart2) } }
176
+ # новое значение в новой партиции
177
+ before { values.times { counter.add(:param0 => 4, :param1 => 5, :part => :part2, :subpart => :subpart1) } }
178
+
179
+ context 'when no cluster given' do
180
+ it { expect { counter.partitions }.to_not raise_error KeyError }
181
+ end
182
+
183
+ context 'when no partition given' do
184
+ it { expect(counter.partitions).to have(3).partitions }
185
+ it { expect(counter.partitions.first).to eq part1_subpart1 }
186
+ it { expect(counter.partitions.second).to eq part1_subpart2 }
187
+ it { expect(counter.partitions.third).to eq part2_subpart1 }
188
+ end
189
+
190
+ context 'when not leaf partition given' do
191
+ it { expect(counter.partitions(:part => :part1)).to have(2).partitions }
192
+ it { expect(counter.partitions(:part => :part1).first).to eq part1_subpart1 }
193
+ it { expect(counter.partitions(:part => :part1).second).to eq part1_subpart2 }
194
+ end
195
+
196
+ context 'when leaf partition given' do
197
+ it { expect(counter.partitions(:part => :part1, 'subpart' => 'subpart1')).to have(1).partitions }
198
+ it { expect(counter.partitions(:part => :part1, 'subpart' => 'subpart1').first).to eq part1_subpart1 }
199
+ end
200
+ end
201
+
202
+ context 'when cluster keys given and partition keys not given' do
203
+ let(:options) { {
204
+ :counter_name => :test_counter,
205
+ :value_keys => [:param0, :param1],
206
+ :cluster_keys => [:cluster, :subcluster]
207
+ } }
208
+
209
+ # 2 разных знач в одном кластере
210
+ before { values.times { counter.add(:param0 => 1, :param1 => 2, :cluster => :cluster1, :subcluster => :subcluster1) } }
211
+ before { values.times { counter.add(:param0 => 1, :param1 => 3, :cluster => :cluster1, :subcluster => :subcluster1) } }
212
+ # дубль знач в другом кластере
213
+ before { values.times { counter.add(:param0 => 1, :param1 => 2, :cluster => :cluster1, :subcluster => :subcluster3) } }
214
+ # новое значение в новом кластере
215
+ before { values.times { counter.add(:param0 => 5, :param1 => 6, :cluster => :cluster2, :subcluster => :subcluster1) } }
216
+ # новое значение в новом подкластере
217
+ before { values.times { counter.add(:param0 => 6, :param1 => 7, :cluster => :cluster1, :subcluster => :subcluster2) } }
218
+
219
+
220
+ context 'when no partition given' do
221
+ it { expect(counter.partitions(cluster1_subcluster1)).to have(1).partitions }
222
+ it { expect(counter.partitions(cluster1_subcluster1).first).to eq Hash.new }
223
+
224
+ it { expect(counter.partitions(cluster2_subcluster1)).to have(1).partitions }
225
+ it { expect(counter.partitions(cluster2_subcluster1).first).to eq Hash.new }
226
+ end
227
+ end
228
+ end
229
+
230
+ context '#data' do
231
+ let(:cluster1_subcluster1) { {:cluster => :cluster1, :subcluster => :subcluster1} }
232
+ let(:cluster1_subcluster2) { {:cluster => :cluster1, :subcluster => :subcluster2} }
233
+ let(:cluster1_subcluster3) { {:cluster => :cluster1, :subcluster => :subcluster3} }
234
+ let(:cluster2_subcluster1) { {:cluster => :cluster2, :subcluster => :subcluster1} }
235
+
236
+ let(:part1_subpart1) { {:part => 'part1', :subpart => 'subpart1'}.with_indifferent_access }
237
+ let(:part1_subpart2) { {:part => 'part1', :subpart => 'subpart2'}.with_indifferent_access }
238
+ let(:part2_subpart1) { {'part' => 'part2', :subpart => 'subpart1'}.with_indifferent_access }
239
+
240
+ context 'when cluster and partition keys given' do
241
+ let(:options) { {
242
+ :counter_name => :test_counter,
243
+ :value_keys => [:param0, :param1],
244
+ :cluster_keys => [:cluster, :subcluster],
245
+ :partition_keys => [:part, :subpart]
246
+ } }
247
+
248
+ # 2 разных знач в одном кластере и партиции
249
+ before { values.times { counter.add(:param0 => 1, :param1 => 2, :cluster => :cluster1, :subcluster => :subcluster1, :part => :part1, :subpart => :subpart1) } }
250
+ before { values.times { counter.add(:param0 => 1, :param1 => 3, :cluster => :cluster1, :subcluster => :subcluster1, :part => :part1, :subpart => :subpart1) } }
251
+ # дубль знач в другой партиции
252
+ before { values.times { counter.add(:param0 => 1, :param1 => 2, :cluster => :cluster1, :subcluster => :subcluster1, :part => :part1, :subpart => :subpart3) } }
253
+ # дубль знач в другом кластере
254
+ before { values.times { counter.add(:param0 => 1, :param1 => 2, :cluster => :cluster1, :subcluster => :subcluster3, :part => :part1, :subpart => :subpart1) } }
255
+ # новое значение в новой подпартиции
256
+ before { values.times { counter.add(:param0 => 3, :param1 => 4, :cluster => :cluster1, :subcluster => :subcluster1, :part => :part1, :subpart => :subpart2) } }
257
+ # новое значение в новой партиции
258
+ before { values.times { counter.add(:param0 => 4, :param1 => 5, :cluster => :cluster1, :subcluster => :subcluster1, :part => :part2, :subpart => :subpart1) } }
259
+ # новое значение в новом кластере
260
+ before { values.times { counter.add(:param0 => 5, :param1 => 6, :cluster => :cluster2, :subcluster => :subcluster1, :part => :part1, :subpart => :subpart1) } }
261
+ # новое значение в новом подкластере
262
+ before { values.times { counter.add(:param0 => 6, :param1 => 7, :cluster => :cluster1, :subcluster => :subcluster2, :part => :part1, :subpart => :subpart1) } }
263
+
264
+ context 'when no cluster given' do
265
+ it { expect { counter.data }.to raise_error ArgumentError }
266
+ end
267
+
268
+ context 'when no leaf cluster given' do
269
+ it { expect { counter.data(:cluster => :cluster1) }.to raise_error KeyError }
270
+ end
271
+
272
+ context 'when unknown cluster given' do
273
+ it { expect(counter.data(:cluster => :unknown_cluster, :subcluster => :subcluster)).to have(0).partitions }
274
+ end
275
+
276
+ context 'when no partition given' do
277
+ it { expect(counter.data(cluster1_subcluster1)).to have(4).rows }
278
+ it { expect(counter.data(cluster1_subcluster1)).to include ({'param0' => '1', 'param1' => '2'}) }
279
+ it { expect(counter.data(cluster1_subcluster1)).to include ({'param0' => '1', 'param1' => '3'}) }
280
+ it { expect(counter.data(cluster1_subcluster1)).to include ({'param0' => '3', 'param1' => '4'}) }
281
+ it { expect(counter.data(cluster1_subcluster1)).to include ({'param0' => '4', 'param1' => '5'}) }
282
+
283
+ it { expect(counter.data(cluster2_subcluster1)).to have(1).rows }
284
+ it { expect(counter.data(cluster2_subcluster1).first).to include ({'param0' => '5', 'param1' => '6'}) }
285
+ end
286
+
287
+ context 'when not leaf partition given' do
288
+ it { expect(counter.data(cluster1_subcluster1.merge(:part => :part1))).to have(3).rows }
289
+ it { expect(counter.data(cluster1_subcluster1.merge(:part => :part1))).to include ({'param0' => '1', 'param1' => '2'}) }
290
+ it { expect(counter.data(cluster1_subcluster1.merge(:part => :part1))).to include ({'param0' => '1', 'param1' => '3'}) }
291
+ it { expect(counter.data(cluster1_subcluster1.merge(:part => :part1))).to include ({'param0' => '3', 'param1' => '4'}) }
292
+ end
293
+
294
+ context 'when leaf partition given' do
295
+ it { expect(counter.data(cluster1_subcluster1.merge(:part => :part1, 'subpart' => 'subpart1'))).to have(2).rows }
296
+ it { expect(counter.data(cluster1_subcluster1.merge(:part => :part1, 'subpart' => 'subpart1'))).to include ({'param0' => '1', 'param1' => '2'}) }
297
+ it { expect(counter.data(cluster1_subcluster1.merge(:part => :part1, 'subpart' => 'subpart1'))).to include ({'param0' => '1', 'param1' => '3'}) }
298
+ end
299
+ end
300
+
301
+ context 'when not cluster keys given and partition keys given' do
302
+ let(:options) { {
303
+ :counter_name => :test_counter,
304
+ :value_keys => [:param0, :param1],
305
+ :partition_keys => [:part, :subpart]
306
+ } }
307
+
308
+ # 2 разных знач в одной партиции
309
+ before { values.times { counter.add(:param0 => 1, :param1 => 2, :part => :part1, :subpart => :subpart1) } }
310
+ before { values.times { counter.add(:param0 => 1, :param1 => 3, :part => :part1, :subpart => :subpart1) } }
311
+ # дубль знач в другой партиции
312
+ before { values.times { counter.add(:param0 => 1, :param1 => 2, :part => :part1, :subpart => :subpart3) } }
313
+ # новое значение в новой подпартиции
314
+ before { values.times { counter.add(:param0 => 3, :param1 => 4, :part => :part1, :subpart => :subpart2) } }
315
+ # новое значение в новой партиции
316
+ before { values.times { counter.add(:param0 => 4, :param1 => 5, :part => :part2, :subpart => :subpart1) } }
317
+
318
+ context 'when no cluster given' do
319
+ it { expect { counter.data }.to_not raise_error KeyError }
320
+ end
321
+
322
+ context 'when no partition given' do
323
+ it { expect(counter.data).to have(4).rows }
324
+ it { expect(counter.data).to include ({'param0' => '1', 'param1' => '2'}) }
325
+ it { expect(counter.data).to include ({'param0' => '1', 'param1' => '3'}) }
326
+ it { expect(counter.data).to include ({'param0' => '3', 'param1' => '4'}) }
327
+ it { expect(counter.data).to include ({'param0' => '4', 'param1' => '5'}) }
328
+ end
329
+
330
+ context 'when not leaf partition given' do
331
+ it { expect(counter.data(:part => :part1)).to have(3).rows }
332
+ it { expect(counter.data(:part => :part1)).to include ({'param0' => '1', 'param1' => '2'}) }
333
+ it { expect(counter.data(:part => :part1)).to include ({'param0' => '1', 'param1' => '3'}) }
334
+ it { expect(counter.data(:part => :part1)).to include ({'param0' => '3', 'param1' => '4'}) }
335
+ end
336
+
337
+ context 'when leaf partition given' do
338
+ it { expect(counter.data(:part => :part1, 'subpart' => 'subpart1')).to have(2).items }
339
+ it { expect(counter.data(:part => :part1, 'subpart' => 'subpart1')).to include ({'param0' => '1', 'param1' => '2'}) }
340
+ it { expect(counter.data(:part => :part1, 'subpart' => 'subpart1')).to include ({'param0' => '1', 'param1' => '3'}) }
341
+ end
342
+ end
343
+
344
+ context 'when cluster keys given and partition keys not given' do
345
+ let(:options) { {
346
+ :counter_name => :test_counter,
347
+ :value_keys => [:param0, :param1],
348
+ :cluster_keys => [:cluster, :subcluster]
349
+ } }
350
+
351
+ # 2 разных знач в одном кластере
352
+ before { values.times { counter.add(:param0 => 1, :param1 => 2, :cluster => :cluster1, :subcluster => :subcluster1) } }
353
+ before { values.times { counter.add(:param0 => 1, :param1 => 3, :cluster => :cluster1, :subcluster => :subcluster1) } }
354
+ # дубль знач в другом кластере
355
+ before { values.times { counter.add(:param0 => 1, :param1 => 2, :cluster => :cluster1, :subcluster => :subcluster3) } }
356
+ # новое значение в новом кластере
357
+ before { values.times { counter.add(:param0 => 5, :param1 => 6, :cluster => :cluster2, :subcluster => :subcluster1) } }
358
+ # новое значение в новом подкластере
359
+ before { values.times { counter.add(:param0 => 6, :param1 => 7, :cluster => :cluster1, :subcluster => :subcluster2) } }
360
+
361
+
362
+ context 'when no partition given' do
363
+ it { expect(counter.partitions(cluster1_subcluster1)).to have(1).partitions }
364
+ it { expect(counter.partitions(cluster1_subcluster1).first).to eq Hash.new }
365
+
366
+ it { expect(counter.partitions(cluster2_subcluster1)).to have(1).partitions }
367
+ it { expect(counter.partitions(cluster2_subcluster1).first).to eq Hash.new }
368
+ end
369
+ end
370
+ end
371
+
372
+ context '#delete_partitions!' do
373
+ let(:cluster1_subcluster1) { {:cluster => :cluster1, :subcluster => :subcluster1} }
374
+ let(:cluster1_subcluster2) { {:cluster => :cluster1, :subcluster => :subcluster2} }
375
+ let(:cluster1_subcluster3) { {:cluster => :cluster1, :subcluster => :subcluster3} }
376
+ let(:cluster2_subcluster1) { {:cluster => :cluster2, :subcluster => :subcluster1} }
377
+
378
+ let(:part1_subpart1) { {:part => 'part1', :subpart => 'subpart1'}.with_indifferent_access }
379
+ let(:part1_subpart2) { {:part => 'part1', :subpart => 'subpart2'}.with_indifferent_access }
380
+ let(:part2_subpart1) { {'part' => 'part2', :subpart => 'subpart1'}.with_indifferent_access }
381
+
382
+ context 'when cluster and partition keys given' do
383
+ let(:options) { {
384
+ :counter_name => :test_counter,
385
+ :value_keys => [:param0, :param1],
386
+ :cluster_keys => [:cluster, :subcluster],
387
+ :partition_keys => [:part, :subpart]
388
+ } }
389
+
390
+ # 2 разных знач в одном кластере и партиции
391
+ before { values.times { counter.add(:param0 => 1, :param1 => 2, :cluster => :cluster1, :subcluster => :subcluster1, :part => :part1, :subpart => :subpart1) } }
392
+ before { values.times { counter.add(:param0 => 1, :param1 => 3, :cluster => :cluster1, :subcluster => :subcluster1, :part => :part1, :subpart => :subpart1) } }
393
+ # дубль знач в другой партиции
394
+ before { values.times { counter.add(:param0 => 1, :param1 => 2, :cluster => :cluster1, :subcluster => :subcluster1, :part => :part1, :subpart => :subpart3) } }
395
+ # дубль знач в другом кластере
396
+ before { values.times { counter.add(:param0 => 1, :param1 => 2, :cluster => :cluster1, :subcluster => :subcluster3, :part => :part1, :subpart => :subpart1) } }
397
+ # новое значение в новой подпартиции
398
+ before { values.times { counter.add(:param0 => 3, :param1 => 4, :cluster => :cluster1, :subcluster => :subcluster1, :part => :part1, :subpart => :subpart2) } }
399
+ # новое значение в новой партиции
400
+ before { values.times { counter.add(:param0 => 4, :param1 => 5, :cluster => :cluster1, :subcluster => :subcluster1, :part => :part2, :subpart => :subpart1) } }
401
+ # новое значение в новом кластере
402
+ before { values.times { counter.add(:param0 => 5, :param1 => 6, :cluster => :cluster2, :subcluster => :subcluster1, :part => :part1, :subpart => :subpart1) } }
403
+ # новое значение в новом подкластере
404
+ before { values.times { counter.add(:param0 => 6, :param1 => 7, :cluster => :cluster1, :subcluster => :subcluster2, :part => :part1, :subpart => :subpart1) } }
405
+
406
+ context 'when no cluster given' do
407
+ it { expect { counter.delete_partitions! }.to raise_error ArgumentError }
408
+ end
409
+
410
+ context 'when no leaf cluster given' do
411
+ it { expect { counter.delete_partitions!(:cluster => :cluster1, :part => 1) }.to raise_error KeyError }
412
+ end
413
+
414
+ context 'when unknown cluster given' do
415
+ it { expect(counter.delete_partitions!(:cluster => :unknown_cluster, :subcluster => :subcluster, :part => 1)).to_not raise_error }
416
+ end
417
+
418
+ context 'when no partition given' do
419
+ before { counter.delete_partitions!(:cluster => :cluster1, :subcluster => :subcluster1) }
420
+
421
+ it { expect(counter.data(:cluster => :cluster1, :subcluster => :subcluster1)).to be_empty }
422
+ it { expect(counter.partitions(:cluster => :cluster1, :subcluster => :subcluster1)).to be_empty }
423
+
424
+ it { expect(counter.partitions(cluster2_subcluster1.merge(:part => :part1))).to be_present }
425
+ it { expect(counter.data(cluster2_subcluster1.merge(:part => :part1))).to have(1).rows }
426
+ it { expect(counter.data(cluster2_subcluster1.merge(:part => :part1))).to include ({'param0' => '5', 'param1' => '6'}) }
427
+ end
428
+
429
+ context 'when not leaf partition given' do
430
+ before { counter.delete_partitions!(cluster1_subcluster1.merge(:part => :part1)) }
431
+
432
+ it { expect(counter.partitions(cluster1_subcluster1.merge(:part => :part1))).to have(0).rows }
433
+
434
+ it { expect(counter.partitions(cluster1_subcluster1.merge(:part => :part2))).to be_present }
435
+ it { expect(counter.data(cluster1_subcluster1.merge(:part => :part2))).to have(1).rows }
436
+ it { expect(counter.data(cluster1_subcluster1.merge(:part => :part2))).to include ({'param0' => '4', 'param1' => '5'}) }
437
+
438
+ it { expect(counter.partitions(cluster2_subcluster1.merge(:part => :part1))).to be_present }
439
+ it { expect(counter.data(cluster2_subcluster1.merge(:part => :part1))).to have(1).rows }
440
+ it { expect(counter.data(cluster2_subcluster1.merge(:part => :part1))).to include ({'param0' => '5', 'param1' => '6'}) }
441
+ end
442
+
443
+ context 'when leaf partition given' do
444
+ before { counter.delete_partitions!(cluster1_subcluster1.merge(:part => :part1, :subpart => :subpart1)) }
445
+
446
+ it { expect(counter.partitions(cluster1_subcluster1.merge(:part => :part1, :subpart => :subpart1))).to have(0).rows }
447
+
448
+ it { expect(counter.partitions(cluster1_subcluster1.merge(:part => :part1, :subpart => :subpart2))).to have(1).rows }
449
+ it { expect(counter.data(cluster1_subcluster1.merge(:part => :part1, :subpart => :subpart2))).to include ({'param0' => '3', 'param1' => '4'}) }
450
+ end
451
+ end
452
+ end
453
+
454
+ context '#delete_all!' do
455
+ let(:cluster1_subcluster1) { {:cluster => :cluster1, :subcluster => :subcluster1} }
456
+ let(:cluster1_subcluster2) { {:cluster => :cluster1, :subcluster => :subcluster2} }
457
+ let(:cluster1_subcluster3) { {:cluster => :cluster1, :subcluster => :subcluster} }
458
+ let(:cluster2_subcluster1) { {:cluster => :cluster2, :subcluster => :subcluster1} }
459
+
460
+ let(:part1_subpart1) { {:part => 'part1', :subpart => 'subpart1'}.with_indifferent_access }
461
+ let(:part1_subpart2) { {:part => 'part1', :subpart => 'subpart2'}.with_indifferent_access }
462
+ let(:part2_subpart1) { {'part' => 'part2', :subpart => 'subpart1'}.with_indifferent_access }
463
+
464
+ context 'when cluster and partition keys given' do
465
+ let(:options) { {
466
+ :counter_name => :test_counter,
467
+ :value_keys => [:param0, :param1],
468
+ :cluster_keys => [:cluster, :subcluster],
469
+ :partition_keys => [:part, :subpart]
470
+ } }
471
+
472
+ # 2 разных знач в одном кластере и партиции
473
+ before { values.times { counter.add(:param0 => 1, :param1 => 2, :cluster => :cluster1, :subcluster => :subcluster1, :part => :part1, :subpart => :subpart1) } }
474
+ before { values.times { counter.add(:param0 => 1, :param1 => 3, :cluster => :cluster1, :subcluster => :subcluster1, :part => :part1, :subpart => :subpart1) } }
475
+ # дубль знач в другой партиции
476
+ before { values.times { counter.add(:param0 => 1, :param1 => 2, :cluster => :cluster1, :subcluster => :subcluster1, :part => :part1, :subpart => :subpart3) } }
477
+ # дубль знач в другом кластере
478
+ before { values.times { counter.add(:param0 => 1, :param1 => 2, :cluster => :cluster1, :subcluster => :subcluster3, :part => :part1, :subpart => :subpart1) } }
479
+ # новое значение в новой подпартиции
480
+ before { values.times { counter.add(:param0 => 3, :param1 => 4, :cluster => :cluster1, :subcluster => :subcluster1, :part => :part1, :subpart => :subpart2) } }
481
+ # новое значение в новой партиции
482
+ before { values.times { counter.add(:param0 => 4, :param1 => 5, :cluster => :cluster1, :subcluster => :subcluster1, :part => :part2, :subpart => :subpart1) } }
483
+ # новое значение в новом кластере
484
+ before { values.times { counter.add(:param0 => 5, :param1 => 6, :cluster => :cluster2, :subcluster => :subcluster1, :part => :part1, :subpart => :subpart1) } }
485
+ # новое значение в новом подкластере
486
+ before { values.times { counter.add(:param0 => 6, :param1 => 7, :cluster => :cluster1, :subcluster => :subcluster2, :part => :part1, :subpart => :subpart1) } }
487
+
488
+ context 'when no cluster given' do
489
+ it { expect { counter.delete_all! }.to raise_error ArgumentError }
490
+ end
491
+
492
+ context 'when no leaf cluster given' do
493
+ it { expect { counter.delete_all!(:cluster => :cluster1) }.to raise_error KeyError }
494
+ end
495
+
496
+ context 'when unknown cluster given' do
497
+ before { counter.delete_all!(:cluster => :unknown_cluster, :subcluster => :subcluster) }
498
+
499
+ it { expect(counter.partitions(cluster1_subcluster1)).to have(3).partitions }
500
+ end
501
+
502
+ context 'when unknown params given' do
503
+ it { expect { counter.delete_all!(:cluster1 => :cluster1) }.to raise_error KeyError }
504
+ end
505
+
506
+ context 'when no partition given' do
507
+ before { counter.delete_all!(cluster1_subcluster1) }
508
+
509
+ it { expect(counter.data(cluster1_subcluster1)).to have(0).rows }
510
+ it { expect(counter.data(cluster2_subcluster1)).to have(1).rows }
511
+ it { expect(counter.data(cluster1_subcluster2)).to have(1).rows }
512
+ it { expect(counter.data(cluster2_subcluster1)).to include ({'param0' => '5', 'param1' => '6'}) }
513
+ it { expect(counter.data(cluster1_subcluster2)).to include ({'param0' => '6', 'param1' => '7'}) }
514
+
515
+ it { expect(counter.partitions(cluster1_subcluster1)).to have(0).partitions }
516
+ it { expect(counter.partitions(cluster2_subcluster1)).to have(1).partitions }
517
+ it { expect(counter.partitions(cluster2_subcluster1)).to have(1).partitions }
518
+ end
519
+ end
520
+
521
+ context 'when cluster not given and partition keys given' do
522
+ let(:options) { {
523
+ :counter_name => :test_counter,
524
+ :value_keys => [:param0, :param1],
525
+ :partition_keys => [:part, :subpart]
526
+ } }
527
+
528
+ # 2 разных знач в одном кластере и партиции
529
+ before { values.times { counter.add(:param0 => 1, :param1 => 2, :cluster => :cluster1, :subcluster => :subcluster1, :part => :part1, :subpart => :subpart1) } }
530
+ before { values.times { counter.add(:param0 => 1, :param1 => 3, :cluster => :cluster1, :subcluster => :subcluster1, :part => :part1, :subpart => :subpart1) } }
531
+ # дубль знач в другой партиции
532
+ before { values.times { counter.add(:param0 => 1, :param1 => 2, :cluster => :cluster1, :subcluster => :subcluster1, :part => :part1, :subpart => :subpart3) } }
533
+ # дубль знач в другом кластере
534
+ before { values.times { counter.add(:param0 => 1, :param1 => 2, :cluster => :cluster1, :subcluster => :subcluster3, :part => :part1, :subpart => :subpart1) } }
535
+ # новое значение в новой подпартиции
536
+ before { values.times { counter.add(:param0 => 3, :param1 => 4, :cluster => :cluster1, :subcluster => :subcluster1, :part => :part1, :subpart => :subpart2) } }
537
+ # новое значение в новой партиции
538
+ before { values.times { counter.add(:param0 => 4, :param1 => 5, :cluster => :cluster1, :subcluster => :subcluster1, :part => :part2, :subpart => :subpart1) } }
539
+ # новое значение в новом кластере
540
+ before { values.times { counter.add(:param0 => 5, :param1 => 6, :cluster => :cluster2, :subcluster => :subcluster1, :part => :part1, :subpart => :subpart1) } }
541
+ # новое значение в новом подкластере
542
+ before { values.times { counter.add(:param0 => 6, :param1 => 7, :cluster => :cluster1, :subcluster => :subcluster2, :part => :part1, :subpart => :subpart1) } }
543
+
544
+ context 'when no cluster given' do
545
+ before { counter.delete_all! }
546
+
547
+ it { expect(counter.partitions).to have(0).partitions }
548
+ end
549
+
550
+ context 'when unknown cluster given' do
551
+ before { counter.delete_all!(:cluster => :unknown_cluster, :subcluster => :subcluster) }
552
+
553
+ it { expect(counter.partitions).to have(0).partitions }
554
+ end
555
+
556
+ context 'when unknown params given' do
557
+ before { counter.delete_all!(:cluster1 => :cluster1) }
558
+
559
+ it { expect(counter.partitions).to have(0).partitions }
560
+ end
561
+ end
562
+ end
563
+ end