ac-summarization-utils 0.0.47.rc1
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.
- data/.gitignore +4 -0
- data/Gemfile +14 -0
- data/README.md +22 -0
- data/Rakefile +2 -0
- data/ac-summarization-utils.gemspec +24 -0
- data/ac-summarization-utils.iml +28 -0
- data/lib/ac-summarization-utils.rb +8 -0
- data/lib/ac-summarization-utils/errors_handler.rb +77 -0
- data/lib/ac-summarization-utils/general_utils.rb +25 -0
- data/lib/ac-summarization-utils/lookup_cache.rb +480 -0
- data/lib/ac-summarization-utils/record.rb +40 -0
- data/lib/ac-summarization-utils/results_dal.rb +189 -0
- data/lib/ac-summarization-utils/revenue_calc_utils.rb +41 -0
- data/lib/ac-summarization-utils/summarization_utils.rb +119 -0
- data/lib/ac-summarization-utils/validation_utils.rb +93 -0
- data/lib/ac-summarization-utils/version.rb +3 -0
- data/spec/errors_handler_spec.rb +52 -0
- data/spec/general_utils_spec.rb +35 -0
- data/spec/lookup_cache_spec.rb +956 -0
- data/spec/results_dal_spec.rb +349 -0
- data/spec/revenue_calc_utils_spec.rb +125 -0
- data/spec/summarization_utils_spec.rb +210 -0
- data/spec/validation_utils_spec.rb +328 -0
- metadata +116 -0
@@ -0,0 +1,210 @@
|
|
1
|
+
require 'rspec'
|
2
|
+
require 'redis'
|
3
|
+
require 'mysql2'
|
4
|
+
require_relative '../lib/ac-summarization-utils/summarization_utils'
|
5
|
+
|
6
|
+
include ACSummarizationUtils
|
7
|
+
include ACSummarizationUtils::SummUtils
|
8
|
+
|
9
|
+
describe "Summarization Utils#" do
|
10
|
+
|
11
|
+
context "duplicate records#" do
|
12
|
+
it "should duplicate fields with multiple values" do
|
13
|
+
record1 = Record.new({ :required => {"ad_id" => 10},:group_fields=>{}})
|
14
|
+
|
15
|
+
input = [record1]
|
16
|
+
result = duplicate_records(input, "topic_id", [100,200,300])
|
17
|
+
result.should == [Record.new({:required => {"ad_id" => 10, "topic_id" => 100}, :group_fields=>{}}),
|
18
|
+
Record.new({:required => {"ad_id" => 10, "topic_id" => 200}, :group_fields=>{}}),
|
19
|
+
Record.new({:required => {"ad_id" => 10, "topic_id" => 300}, :group_fields=>{}})]
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should duplicate fields one value" do
|
23
|
+
record1 = Record.new({ :required => {"ad_id" => 10},:group_fields=>{}})
|
24
|
+
|
25
|
+
input = [record1]
|
26
|
+
|
27
|
+
result = duplicate_records(input, "topic_id", [100])
|
28
|
+
result.should == [Record.new({:required => {"ad_id" => 10, "topic_id" => 100}, :group_fields=>{}})]
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should duplicate multiple records with mupltiple values" do
|
32
|
+
record1 = Record.new({ :required => {"ad_id" => 10},:group_fields=>{}})
|
33
|
+
record2 = Record.new({ :required => {"ad_id" => 11},:group_fields=>{}})
|
34
|
+
|
35
|
+
input = [record1, record2]
|
36
|
+
|
37
|
+
result = duplicate_records(input, "topic_id", [100,200])
|
38
|
+
result.should == [Record.new({:required => {"ad_id" => 10, "topic_id" => 100}, :group_fields=>{}}),
|
39
|
+
Record.new({:required => {"ad_id" => 11, "topic_id" => 100}, :group_fields=>{}}),
|
40
|
+
Record.new({:required => {"ad_id" => 10, "topic_id" => 200}, :group_fields=>{}}),
|
41
|
+
Record.new({:required => {"ad_id" => 11, "topic_id" => 200}, :group_fields=>{}})]
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should keep fields to group by" do
|
45
|
+
record1 = Record.new({ :required => {"ad_id" => 10},:group_fields=>{"ad_id" => 10}})
|
46
|
+
record2 = Record.new({ :required => {"ad_id" => 11},:group_fields=>{"ad_id" => 10}})
|
47
|
+
|
48
|
+
input = [record1, record2]
|
49
|
+
|
50
|
+
result = duplicate_records(input, "topic_id", [100,200])
|
51
|
+
result.should == [Record.new({:required => {"ad_id" => 10, "topic_id" => 100}, :group_fields=>{"ad_id" => 10}}),
|
52
|
+
Record.new({:required => {"ad_id" => 11, "topic_id" => 100}, :group_fields=>{"ad_id" => 10}}),
|
53
|
+
Record.new({:required => {"ad_id" => 10, "topic_id" => 200}, :group_fields=>{"ad_id" => 10}}),
|
54
|
+
Record.new({:required => {"ad_id" => 11, "topic_id" => 200}, :group_fields=>{"ad_id" => 10}})]
|
55
|
+
end
|
56
|
+
|
57
|
+
it "should return given records if input array is null or expanded fileds are not good" do
|
58
|
+
|
59
|
+
duplicate_records(nil, nil, nil).should == nil
|
60
|
+
duplicate_records(nil, "topic_id", [100,200]).should == nil
|
61
|
+
duplicate_records([], "topic_id", [100,200]).should == []
|
62
|
+
|
63
|
+
record1 = Record.new({ :required => {"ad_id" => 10},:group_fields=>{"ad_id" => 10}})
|
64
|
+
record2 = Record.new({ :required => {"ad_id" => 11},:group_fields=>{"ad_id" => 10}})
|
65
|
+
|
66
|
+
input = [record1, record2]
|
67
|
+
|
68
|
+
duplicate_records(input, nil, [100,200]).should == input
|
69
|
+
duplicate_records(input, "topic_id", nil).should == input
|
70
|
+
duplicate_records(input, "topic_id", []).should == input
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
|
75
|
+
context "summarize records#" do
|
76
|
+
it "should handle nil and empty values correctly" do
|
77
|
+
|
78
|
+
summarize_records(nil, [{:method => method(:sum), :input_field_name => "cpc", :output_field_name => "spend"}]).should == []
|
79
|
+
summarize_records([], [{:method => method(:sum), :input_field_name => "cpc", :output_field_name => "spend"}]).should == []
|
80
|
+
end
|
81
|
+
|
82
|
+
|
83
|
+
it "should summarize records with sum for 1 record" do
|
84
|
+
|
85
|
+
input = [Record.new({:required => {"ad_id" => 10} , :group_fields => { "cpc" => 0.6}})]
|
86
|
+
summarize_records(input, [{:method => method(:sum), :input_field_name => "cpc", :output_field_name => "spend"}]).should == [{"ad_id" => 10, "spend" => 0.6}]
|
87
|
+
end
|
88
|
+
|
89
|
+
it "should summarize records with count for 1 record" do
|
90
|
+
|
91
|
+
input = [Record.new({:required => {"ad_id" => 10} , :group_fields => { "ad_id" => 10}})]
|
92
|
+
summarize_records(input, [{:method => method(:count), :input_field_name => "ad_id", :output_field_name => "clicks"}]).should == [{"ad_id" => 10, "clicks" => 1}]
|
93
|
+
end
|
94
|
+
|
95
|
+
it "should summarize records with count for more than 1 record" do
|
96
|
+
|
97
|
+
input = [Record.new({:required => {"ad_id" => 10, "adgroup_id" => 5} , :group_fields => { "ad_id" => 10}}),
|
98
|
+
Record.new({:required => {"ad_id" => 20, "adgroup_id" => 5} , :group_fields => { "ad_id" => 20}}),
|
99
|
+
Record.new({:required => {"ad_id" => 10, "adgroup_id" => 5} , :group_fields => { "ad_id" => 10}})]
|
100
|
+
|
101
|
+
group_options = [{:method => method(:count), :input_field_name => "ad_id", :output_field_name => "clicks"}]
|
102
|
+
|
103
|
+
summarize_records(input,group_options).should == [{"ad_id" => 10, "adgroup_id" => 5, "clicks" => 2}, {"ad_id" => 20, "adgroup_id" => 5, "clicks" => 1}]
|
104
|
+
end
|
105
|
+
|
106
|
+
it "should summarize records with sum for more than 1 record" do
|
107
|
+
|
108
|
+
input = [Record.new({:required => {"ad_id" => 10, "adgroup_id" => 5} , :group_fields => { "cpc" => 0.1}}),
|
109
|
+
Record.new({:required => {"ad_id" => 20, "adgroup_id" => 5} , :group_fields => { "cpc" => 0.2}}),
|
110
|
+
Record.new({:required => {"ad_id" => 10, "adgroup_id" => 5} , :group_fields => { "cpc" => 0.3}})]
|
111
|
+
|
112
|
+
group_options = [{:method => method(:sum), :input_field_name => "cpc", :output_field_name => "spend"}]
|
113
|
+
|
114
|
+
summarize_records(input,group_options ).should == [{"ad_id" => 10, "adgroup_id" => 5, "spend" => 0.4}, {"ad_id" => 20, "adgroup_id" => 5, "spend" => 0.2}]
|
115
|
+
end
|
116
|
+
|
117
|
+
it "should summarize records with sum and count for more than 1 record" do
|
118
|
+
|
119
|
+
input = [Record.new({:required => {"ad_id" => 10, "adgroup_id" => 5} , :group_fields => { "cpc" => 0.1, "ad_id" => 10}}),
|
120
|
+
Record.new({:required => {"ad_id" => 20, "adgroup_id" => 5} , :group_fields => { "cpc" => 0.2, "ad_id" => 20}}),
|
121
|
+
Record.new({:required => {"ad_id" => 10, "adgroup_id" => 5} , :group_fields => { "cpc" => 0.3, "ad_id" => 10}})]
|
122
|
+
group_options = [{:method => method(:sum), :input_field_name => "cpc", :output_field_name => "spend"},
|
123
|
+
{:method => method(:count), :input_field_name => "ad_id", :output_field_name => "clicks"}]
|
124
|
+
|
125
|
+
summarize_records(input,group_options).should == [{"ad_id" => 10, "adgroup_id" => 5, "spend" => 0.4, "clicks" => 2}, {"ad_id" => 20, "adgroup_id" => 5, "spend" => 0.2, "clicks" => 1}]
|
126
|
+
end
|
127
|
+
|
128
|
+
it "should summarize records with sum and count for more than 1 record even if they are strings" do
|
129
|
+
|
130
|
+
input = [Record.new({:required => {"ad_id" => 10, "adgroup_id" => 5} , :group_fields => { "cpc" => "0.1", "ad_id" => 10}}),
|
131
|
+
Record.new({:required => {"ad_id" => 20, "adgroup_id" => 5} , :group_fields => { "cpc" => "0.2", "ad_id" => 20}}),
|
132
|
+
Record.new({:required => {"ad_id" => 10, "adgroup_id" => 5} , :group_fields => { "cpc" => "0.3", "ad_id" => 10}})]
|
133
|
+
group_options = [{:method => method(:sum), :input_field_name => "cpc", :output_field_name => "spend"},
|
134
|
+
{:method => method(:count), :input_field_name => "ad_id", :output_field_name => "clicks"}]
|
135
|
+
|
136
|
+
summarize_records(input,group_options).should == [{"ad_id" => 10, "adgroup_id" => 5, "spend" => 0.4, "clicks" => 2}, {"ad_id" => 20, "adgroup_id" => 5, "spend" => 0.2, "clicks" => 1}]
|
137
|
+
end
|
138
|
+
|
139
|
+
it "should find min records with cpc more than 1 record even if they are strings" do
|
140
|
+
|
141
|
+
input = [Record.new({:required => {"ad_id" => 10, "adgroup_id" => 5} , :group_fields => { "cpc" => "0.1", "ad_id" => 10}}),
|
142
|
+
Record.new({:required => {"ad_id" => 20, "adgroup_id" => 5} , :group_fields => { "cpc" => "0.2", "ad_id" => 20}}),
|
143
|
+
Record.new({:required => {"ad_id" => 10, "adgroup_id" => 5} , :group_fields => { "cpc" => "0.3", "ad_id" => 10}})]
|
144
|
+
group_options = [{:method => method(:minimum), :input_field_name => "cpc", :output_field_name => "min_cpc"}]
|
145
|
+
|
146
|
+
summarize_records(input,group_options).should == [{"ad_id" => 10, "adgroup_id" => 5, "min_cpc" => 0.1}, {"ad_id" => 20, "adgroup_id" => 5, "min_cpc" => 0.2}]
|
147
|
+
end
|
148
|
+
|
149
|
+
it "should find max records with cpc more than 1 record even if they are strings" do
|
150
|
+
|
151
|
+
input = [Record.new({:required => {"ad_id" => 10, "adgroup_id" => 5} , :group_fields => { "cpc" => "0.1", "ad_id" => 10}}),
|
152
|
+
Record.new({:required => {"ad_id" => 20, "adgroup_id" => 5} , :group_fields => { "cpc" => "0.2", "ad_id" => 20}}),
|
153
|
+
Record.new({:required => {"ad_id" => 10, "adgroup_id" => 5} , :group_fields => { "cpc" => "0.3", "ad_id" => 10}})]
|
154
|
+
group_options = [{:method => method(:maximum), :input_field_name => "cpc", :output_field_name => "max_cpc"}]
|
155
|
+
|
156
|
+
summarize_records(input,group_options).should == [{"ad_id" => 10, "adgroup_id" => 5, "max_cpc" => 0.3}, {"ad_id" => 20, "adgroup_id" => 5, "max_cpc" => 0.2}]
|
157
|
+
end
|
158
|
+
|
159
|
+
it "should find average CPC records more than 1 record even if they are strings" do
|
160
|
+
|
161
|
+
input = [Record.new({:required => {"ad_id" => 10, "adgroup_id" => 5} , :group_fields => { "cpc" => "0.1", "ad_id" => 10}}),
|
162
|
+
Record.new({:required => {"ad_id" => 20, "adgroup_id" => 5} , :group_fields => { "cpc" => "0.2", "ad_id" => 20}}),
|
163
|
+
Record.new({:required => {"ad_id" => 10, "adgroup_id" => 5} , :group_fields => { "cpc" => "0.3", "ad_id" => 10}})]
|
164
|
+
group_options = [{:method => method(:average), :input_field_name => "cpc", :output_field_name => "avg_cpc"}]
|
165
|
+
|
166
|
+
summarize_records(input,group_options).should == [{"ad_id" => 10, "adgroup_id" => 5, "avg_cpc" => 0.2,"avg_cpc_sum"=>0.4, "avg_cpc_count"=>2}, {"ad_id" => 20, "adgroup_id" => 5, "avg_cpc" => 0.2,"avg_cpc_sum"=>0.2, "avg_cpc_count"=>1}]
|
167
|
+
end
|
168
|
+
|
169
|
+
it "should raise error if group by field doesn't exist" do
|
170
|
+
|
171
|
+
input = [Record.new({:required => {"ad_id" => 10} , :group_fields => { }})]
|
172
|
+
group_options = [{:method => method(:sum), :input_field_name => "cpc", :output_field_name => "spend"}]
|
173
|
+
|
174
|
+
lambda {summarize_records(input,group_options)}.should raise_error(ArgumentError)
|
175
|
+
end
|
176
|
+
|
177
|
+
end
|
178
|
+
|
179
|
+
context "create_records#" do
|
180
|
+
it "should call spefific create records block after downcase for each message" do
|
181
|
+
messages = [{"A" => "b"}, {"a" => "b"}, {"A" => "b"}]
|
182
|
+
records, input_errors = create_records(nil, nil, messages) do |m|
|
183
|
+
m["a"].should == "b"
|
184
|
+
[m]
|
185
|
+
end
|
186
|
+
records.size.should == 3
|
187
|
+
input_errors.size.should == 0
|
188
|
+
end
|
189
|
+
|
190
|
+
it "should create error messages for each erroneous message" do
|
191
|
+
def print_error(logger, msg)
|
192
|
+
puts "Correctly printed error during test"
|
193
|
+
end
|
194
|
+
messages = [{"A" => "b"}, {"a" => "b"}, {"A" => "b"}]
|
195
|
+
error_message = {:messages => {"A" => "b"}}
|
196
|
+
mock_error_handler = mock("ErrorsHandler")
|
197
|
+
mock_error_handler.should_receive(:generate_error_message).with(any_args()).exactly(3).times.and_return(error_message)
|
198
|
+
mock_logger = mock("logger")
|
199
|
+
mock_logger.stub(:log)
|
200
|
+
|
201
|
+
records, input_errors = create_records(mock_logger, mock_error_handler, messages) do |m|
|
202
|
+
raise ArgumentError.new
|
203
|
+
end
|
204
|
+
records.size.should == 0
|
205
|
+
input_errors.size.should == 3
|
206
|
+
end
|
207
|
+
|
208
|
+
end
|
209
|
+
|
210
|
+
end
|
@@ -0,0 +1,328 @@
|
|
1
|
+
require 'rspec'
|
2
|
+
require 'redis'
|
3
|
+
require 'mysql2'
|
4
|
+
require_relative '../lib/ac-summarization-utils/validation_utils'
|
5
|
+
|
6
|
+
include ACSummarizationUtils
|
7
|
+
include ACSummarizationUtils::ValidationUtils
|
8
|
+
|
9
|
+
CPC_CAMPAIGN = 1
|
10
|
+
CPV_CAMPAIGN = 3
|
11
|
+
|
12
|
+
describe "Validation Utils#" do
|
13
|
+
|
14
|
+
context "is_valid_real_click#" do
|
15
|
+
|
16
|
+
it "should return true if all fields are correct" do
|
17
|
+
click = { "ad_id" => "1", "valid" => 1, "advertiser_id" => 8, "cpc" => "0.1", "clicktype" => 1}
|
18
|
+
is_valid_real_click?(click,CPC_CAMPAIGN).should == true
|
19
|
+
is_valid_real_click?(click,CPV_CAMPAIGN).should == true
|
20
|
+
click = { "ad_id" => "1", "valid" => 1, "advertiser_id" => 8, "cpc" => "0.1", "ct" => 1}
|
21
|
+
is_valid_real_click?(click,CPC_CAMPAIGN).should == true
|
22
|
+
is_valid_real_click?(click,CPV_CAMPAIGN).should == true
|
23
|
+
click = { "ad_id" => "1", "validitytype" => 1, "advertiser_id" => 8, "cpc" => "0.1", "clicktype" => 1}
|
24
|
+
is_valid_real_click?(click,CPC_CAMPAIGN).should == true
|
25
|
+
is_valid_real_click?(click,CPV_CAMPAIGN).should == true
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should return false if the click has ad_id = -1" do
|
29
|
+
click = { "ad_id" => "-1", "valid" => 1, "advertiser_id" => 8, "cpc" => "0.1", "clicktype" => 1}
|
30
|
+
is_valid_real_click?(click,CPC_CAMPAIGN).should == false
|
31
|
+
is_valid_real_click?(click,CPV_CAMPAIGN).should == false
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should return false if the click doesn't have advertiser_id of 8" do
|
35
|
+
click = { "ad_id" => "1", "valid" => 1, "advertiser_id" => 9, "cpc" => "0.1", "clicktype" => 1}
|
36
|
+
is_valid_real_click?(click,CPC_CAMPAIGN).should == false
|
37
|
+
is_valid_real_click?(click,CPV_CAMPAIGN).should == false
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should return false if the click doesn't have allowed clicktype or ct" do
|
41
|
+
click = { "ad_id" => "1", "valid" => 1, "advertiser_id" => 8, "cpc" => "0.1", "clicktype" => 55}
|
42
|
+
is_valid_real_click?(click,CPC_CAMPAIGN).should == false
|
43
|
+
is_valid_real_click?(click,CPV_CAMPAIGN).should == false
|
44
|
+
click = { "ad_id" => "1", "valid" => 1, "advertiser_id" => 8, "cpc" => "0.1", "ct" => 55}
|
45
|
+
is_valid_real_click?(click,CPC_CAMPAIGN).should == false
|
46
|
+
is_valid_real_click?(click,CPV_CAMPAIGN).should == false
|
47
|
+
end
|
48
|
+
|
49
|
+
it "should return false if the click dis not valid" do
|
50
|
+
click = { "ad_id" => "1", "valid" => 2, "advertiser_id" => 8, "cpc" => "0.1", "clicktype" => 1}
|
51
|
+
is_valid_real_click?(click,CPC_CAMPAIGN).should == false
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
|
56
|
+
context "common_click_validations#" do
|
57
|
+
|
58
|
+
it "should return click type and valid value (ad_id of class Fixnum)" do
|
59
|
+
click = { "valid" => 1, "advertiser_id" => 8, "cpc" => "0.1", "clicktype" => 1, "ad_id" => 12}
|
60
|
+
common_click_validations(click).should == [click["clicktype"], click["valid"]]
|
61
|
+
end
|
62
|
+
|
63
|
+
it "should return click type and valid value (ad_id of class String)" do
|
64
|
+
click = { "valid" => 1, "advertiser_id" => 8, "cpc" => "0.1", "clicktype" => 1, "ad_id" => "12"}
|
65
|
+
common_click_validations(click).should == [click["clicktype"], click["valid"]]
|
66
|
+
end
|
67
|
+
|
68
|
+
it "should raise ArgumentError if ad_id doesn't exist" do
|
69
|
+
click = { "valid" => 1, "advertiser_id" => 8, "cpc" => "0.1", "clicktype" => 1}
|
70
|
+
lambda {common_click_validations(click)}.should raise_error(ArgumentError,"message required field 'ad_id' doesn't exist")
|
71
|
+
end
|
72
|
+
|
73
|
+
it "should raise ArgumentError if valid doesn't exist" do
|
74
|
+
click = { "ad_id" => 1, "advertiser_id" => 8, "cpc" => "0.1", "clicktype" => 1}
|
75
|
+
lambda {common_click_validations(click)}.should raise_error(ArgumentError,"message required field valid not validitytype doesn't exist")
|
76
|
+
end
|
77
|
+
|
78
|
+
it "should raise ArgumentError if advertiserid doesn't exist" do
|
79
|
+
click = { "valid" => 1, "ad_id" => 8, "cpc" => "0.1", "clicktype" => 1}
|
80
|
+
lambda {common_click_validations(click)}.should raise_error(ArgumentError,"message required field 'advertiser_id' doesn't exist")
|
81
|
+
end
|
82
|
+
|
83
|
+
it "should raise ArgumentError if cpc doesn't exist" do
|
84
|
+
click = { "valid" => 1, "advertiser_id" => 8, "ad_id" => "1", "clicktype" => 1}
|
85
|
+
lambda {common_click_validations(click)}.should raise_error(ArgumentError,"message required field 'cpc' doesn't exist")
|
86
|
+
end
|
87
|
+
|
88
|
+
it "should raise ArgumentError if clicktype doesn't exist, but click url exists" do
|
89
|
+
click = { "valid" => 1, "advertiser_id" => 8, "cpc" => "0.1", "ad_id" => 1, "clickurl" => 'http://stam.com'}
|
90
|
+
lambda {common_click_validations(click)}.should raise_error(ArgumentError,"message required field click_type not ct doesn't exist")
|
91
|
+
end
|
92
|
+
|
93
|
+
it "should return invalid click if no click type and no clickurl" do
|
94
|
+
click = { "valid" => 1, "advertiser_id" => 8, "cpc" => "0.1", "ad_id" => 1}
|
95
|
+
common_click_validations(click).should == [-1,-1]
|
96
|
+
end
|
97
|
+
|
98
|
+
it "should return invalid click if no click type and clickurl is NULL" do
|
99
|
+
click = { "valid" => 1, "advertiser_id" => 8, "cpc" => "0.1", "ad_id" => 1, "clickurl" => "NULL"}
|
100
|
+
common_click_validations(click).should == [-1,-1]
|
101
|
+
end
|
102
|
+
|
103
|
+
it "should raise ArgumentError if ad id contains something other than numbers" do
|
104
|
+
click = { "valid" => 1, "advertiser_id" => 8, "cpc" => "0.1", "ad_id" => "1qwer;", "clicktype" => 1}
|
105
|
+
lambda {common_click_validations(click)}.should raise_error(ArgumentError,"invalid ad id: 1qwer;")
|
106
|
+
end
|
107
|
+
|
108
|
+
end
|
109
|
+
|
110
|
+
context "is_valid_direct_click#" do
|
111
|
+
|
112
|
+
it "should return true if all fields are correct" do
|
113
|
+
click = { "ad_id" => "1", "valid" => 1, "advertiser_id" => 8, "cpc" => "0.1", "clicktype" => 1}
|
114
|
+
is_valid_direct_click?(click).should == true
|
115
|
+
click = { "ad_id" => "1", "valid" => 1, "advertiser_id" => 8, "cpc" => "0.1", "ct" => 1}
|
116
|
+
is_valid_direct_click?(click).should == true
|
117
|
+
click = { "ad_id" => "1", "validitytype" => 1, "advertiser_id" => 8, "cpc" => "0.1", "clicktype" => 1}
|
118
|
+
is_valid_direct_click?(click).should == true
|
119
|
+
end
|
120
|
+
|
121
|
+
it "should return false if the click has ad_id = -1" do
|
122
|
+
click = { "ad_id" => "-1", "valid" => 1, "advertiser_id" => 8, "cpc" => "0.1", "clicktype" => 1}
|
123
|
+
is_valid_direct_click?(click).should == false
|
124
|
+
end
|
125
|
+
|
126
|
+
it "should return false if the click doesn't have valid or validitytype of 1" do
|
127
|
+
click = { "ad_id" => "1", "valid" => 2, "advertiser_id" => 8, "cpc" => "0.1", "clicktype" => 1}
|
128
|
+
is_valid_direct_click?(click).should == false
|
129
|
+
click = { "ad_id" => "1", "validitytype" => 2, "advertiser_id" => 8, "cpc" => "0.1", "clicktype" => 1}
|
130
|
+
is_valid_direct_click?(click).should == false
|
131
|
+
end
|
132
|
+
|
133
|
+
it "should return false if the click doesn't have advertiser_id of 8" do
|
134
|
+
click = { "ad_id" => "1", "valid" => 1, "advertiser_id" => 9, "cpc" => "0.1", "clicktype" => 1}
|
135
|
+
is_valid_direct_click?(click).should == false
|
136
|
+
end
|
137
|
+
|
138
|
+
it "should return false if the click doesn't have cpc larger than 0.0" do
|
139
|
+
click = { "ad_id" => "1", "valid" => 1, "advertiser_id" => 8, "cpc" => "-0.1", "clicktype" => 1}
|
140
|
+
is_valid_direct_click?(click).should == false
|
141
|
+
end
|
142
|
+
|
143
|
+
it "should return false if the click doesn't have allowed clicktype or ct" do
|
144
|
+
click = { "ad_id" => "1", "valid" => 1, "advertiser_id" => 8, "cpc" => "0.1", "clicktype" => 55}
|
145
|
+
is_valid_direct_click?(click).should == false
|
146
|
+
click = { "ad_id" => "1", "valid" => 1, "advertiser_id" => 8, "cpc" => "0.1", "ct" => 55}
|
147
|
+
is_valid_direct_click?(click).should == false
|
148
|
+
end
|
149
|
+
|
150
|
+
end
|
151
|
+
|
152
|
+
context "is_valid_direct_layer_impr#" do
|
153
|
+
|
154
|
+
it "should return true if all fields are correct" do
|
155
|
+
layer_impr = { "ad_id" => "1", "advertiserid" => 8}
|
156
|
+
is_valid_direct_layer_impr?(layer_impr).should == true
|
157
|
+
end
|
158
|
+
|
159
|
+
it "should return false if the layer has ad_id = -1" do
|
160
|
+
layer_impr = { "ad_id" => "-1", "advertiserid" => 8}
|
161
|
+
is_valid_direct_layer_impr?(layer_impr).should == false
|
162
|
+
end
|
163
|
+
|
164
|
+
|
165
|
+
it "should return false if the layer doesn't have advertiserid of 8" do
|
166
|
+
layer_impr = { "ad_id" => "1","advertiserid" => 9}
|
167
|
+
is_valid_direct_layer_impr?(layer_impr).should == false
|
168
|
+
end
|
169
|
+
|
170
|
+
it "should raise ArgumentError if ad_id doesn't exist" do
|
171
|
+
layer_impr = { "advertiserid" => 8}
|
172
|
+
lambda {is_valid_direct_layer_impr?(layer_impr)}.should raise_error(ArgumentError)
|
173
|
+
end
|
174
|
+
|
175
|
+
it "should raise ArgumentError if advertiserid doesn't exist" do
|
176
|
+
layer_impr = { "ad_id" => 8}
|
177
|
+
lambda {is_valid_direct_layer_impr?(layer_impr)}.should raise_error(ArgumentError)
|
178
|
+
end
|
179
|
+
|
180
|
+
end
|
181
|
+
|
182
|
+
context "is_valid_layer_impr#" do
|
183
|
+
|
184
|
+
it "should return true if all field values are correct and there are no missing values" do
|
185
|
+
layer_impr = { "validitytype" => "1", "cpc" => 0.8, "advertiserid" => 1234, "ad_id" => -1}
|
186
|
+
is_valid_layer_impr?(layer_impr).should == true
|
187
|
+
end
|
188
|
+
|
189
|
+
|
190
|
+
it "should return false if the layer doesn't have cpc value greater than or equal to 0.0" do
|
191
|
+
layer_impr = { "validitytype" => "2", "cpc" => -1.2, "advertiserid" => 55, "ad_id" => -1}
|
192
|
+
is_valid_layer_impr?(layer_impr).should == false
|
193
|
+
end
|
194
|
+
|
195
|
+
it "should raise ArgumentError if cpc doesn't exist" do
|
196
|
+
layer_impr = { "validitytype" => "2", "advertiserid" => 55, "ad_id" => -1}
|
197
|
+
lambda {is_valid_layer_impr?(layer_impr)}.should raise_error(ArgumentError)
|
198
|
+
end
|
199
|
+
|
200
|
+
it "should raise ArgumentError if advertiserid doesn't exist" do
|
201
|
+
layer_impr = { "valid" => "1", "cpc" => 0.2, "ad_id" => 121212}
|
202
|
+
lambda {is_valid_layer_impr?(layer_impr)}.should raise_error(ArgumentError)
|
203
|
+
end
|
204
|
+
|
205
|
+
it "should raise ArgumentError if ad_id doesn't exist" do
|
206
|
+
layer_impr = { "cpc" => 0.2, "advertiserid" => 303, "validitytype" => 1}
|
207
|
+
lambda {is_valid_layer_impr?(layer_impr)}.should raise_error(ArgumentError)
|
208
|
+
end
|
209
|
+
|
210
|
+
end
|
211
|
+
|
212
|
+
context "is_valid_click#" do
|
213
|
+
|
214
|
+
it "should return true if all field values are correct and there are no missing values" do
|
215
|
+
click = { "validitytype" => "1", "cpc" => 0.8, "advertiser_id" => 1234, "clicktype" => 5, "publisher_id" => 131821, "ad_id" => -1}
|
216
|
+
is_valid_click?(click).should == true
|
217
|
+
click = { "valid" => "1", "cpc" => 0.9, "advertiser_id" => 8, "clicktype" => 1, "p" => 55452, "ad_id" => 150231}
|
218
|
+
is_valid_click?(click).should == true
|
219
|
+
click = { "validitytype" => "1", "cpc" => 0.4, "advertiser_id" => 7, "ct" => 1005, "p" => 653351, "ad_id" => -1}
|
220
|
+
is_valid_click?(click).should == true
|
221
|
+
click = { "validitytype" => "1", "cpc" => 0.8, "advertiser_id" => 8, "clicktype" => 2, "publisher_id" => 884223, "ad_id" => 54544}
|
222
|
+
is_valid_click?(click).should == true
|
223
|
+
click = { "valid" => "1", "cpc" => 1.2, "advertiser_id" => 61, "ct" => 6, "publisher_id" => 131821, "ad_id" => -1}
|
224
|
+
is_valid_click?(click).should == true
|
225
|
+
end
|
226
|
+
|
227
|
+
it "should return false if validitytype is not 1" do
|
228
|
+
click = { "valid" => "2", "cpc" => 1.2, "advertiser_id" => 61, "clicktype" => 6, "publisher_id" => 131821, "ad_id" => -1}
|
229
|
+
is_valid_click?(click).should == false
|
230
|
+
click = { "validitytype" => "2", "cpc" => 1.2, "advertiser_id" => 61, "clicktype" => 6, "publisher_id" => 131821, "ad_id" => -1}
|
231
|
+
is_valid_click?(click).should == false
|
232
|
+
end
|
233
|
+
|
234
|
+
|
235
|
+
it "should return false if the clicktype is not allowed" do
|
236
|
+
click = { "valid" => "1", "cpc" => 1.2, "advertiser_id" => 61, "clicktype" => 7, "p" => 131821, "ad_id" => -1}
|
237
|
+
is_valid_click?(click).should == false
|
238
|
+
click = { "validitytype" => "1", "cpc" => 1.2, "advertiser_id" => 8, "ct" => 1006, "publisher_id" => 131821, "ad_id" => -1}
|
239
|
+
is_valid_click?(click).should == false
|
240
|
+
end
|
241
|
+
|
242
|
+
it "should return false if the cpc is below 0.0" do
|
243
|
+
click = { "valid" => "1", "cpc" => -0.5, "advertiser_id" => 61, "clicktype" => 5, "p" => 131821, "ad_id" => -1}
|
244
|
+
is_valid_click?(click).should == false
|
245
|
+
end
|
246
|
+
|
247
|
+
it "should raise ArgumentError if cpc doesn't exist" do
|
248
|
+
click = { "valid" => "1", "advertiser_id" => 61, "clicktype" => 5, "p" => 131821, "ad_id" => -1}
|
249
|
+
lambda {is_valid_click?(click)}.should raise_error(ArgumentError)
|
250
|
+
end
|
251
|
+
|
252
|
+
it "should raise ArgumentError if advertiser_id doesn't exist" do
|
253
|
+
click = { "valid" => "1", "cpc" => 0.55, "ct" => 5, "p" => 131821, "ad_id" => -1}
|
254
|
+
lambda {is_valid_click?(click)}.should raise_error(ArgumentError)
|
255
|
+
end
|
256
|
+
|
257
|
+
it "should raise ArgumentError if publisher_id doesn't exist" do
|
258
|
+
click = { "valid" => "1", "cpc" => 0.55, "clicktype" => 2,"advertiser_id" => 3216, "ad_id" => -1}
|
259
|
+
lambda {is_valid_click?(click)}.should raise_error(ArgumentError)
|
260
|
+
end
|
261
|
+
|
262
|
+
it "should raise ArgumentError if ad_id doesn't exist" do
|
263
|
+
click = { "validitytype" => "1", "cpc" => 0.55, "clicktype" => 1005,"advertiser_id" => 3216, "publisher_id" => 4042}
|
264
|
+
lambda {is_valid_click?(click)}.should raise_error(ArgumentError)
|
265
|
+
end
|
266
|
+
|
267
|
+
it "should raise ArgumentError if validitytype doesn't exist" do
|
268
|
+
click = { "ad_id" => 55422, "cpc" => 0.55, "ct" => 5,"advertiser_id" => 8, "p" => 4042}
|
269
|
+
lambda {is_valid_click?(click)}.should raise_error(ArgumentError)
|
270
|
+
end
|
271
|
+
|
272
|
+
it "should return invalid click if no click type and no clickurl" do
|
273
|
+
click = { "valid" => 1, "advertiser_id" => 8, "cpc" => "0.1", "ad_id" => 1, "p" => 4}
|
274
|
+
is_valid_click?(click).should == false
|
275
|
+
end
|
276
|
+
|
277
|
+
end
|
278
|
+
|
279
|
+
context "is_valid_impression#" do
|
280
|
+
|
281
|
+
it "should return true if all field values are correct and there are no missing values" do
|
282
|
+
imp = { "pid" => 131821, "itid" => 3}
|
283
|
+
is_valid_impression?(imp).should == true
|
284
|
+
|
285
|
+
end
|
286
|
+
|
287
|
+
it "should return false if impression type id is not 3" do
|
288
|
+
imp = { "pid" => 131821, "itid" => 2}
|
289
|
+
is_valid_impression?(imp).should == false
|
290
|
+
imp = { "pid" => 131821, "itid" => 12}
|
291
|
+
is_valid_impression?(imp).should == false
|
292
|
+
end
|
293
|
+
|
294
|
+
it "should raise ArgumentError if pid doesn't exist" do
|
295
|
+
imp = { "pid2" => 131821, "itid" => 3}
|
296
|
+
lambda { is_valid_impression?(imp)}.should raise_error(ArgumentError)
|
297
|
+
end
|
298
|
+
|
299
|
+
it "should raise ArgumentError if itid doesn't exist" do
|
300
|
+
imp = { "pid" => 131821, "itid2" => 3}
|
301
|
+
lambda { is_valid_impression?(imp)}.should raise_error(ArgumentError)
|
302
|
+
end
|
303
|
+
end
|
304
|
+
|
305
|
+
context "is_valid_inimage_report#" do
|
306
|
+
|
307
|
+
it "should return true if value exists and there is an account_id" do
|
308
|
+
click = { "value" => {"account_id" => "119b99ec63b", "campaign_data" => {"iid" => "1234", "kid" => "56342"}}}
|
309
|
+
is_valid_inimage_report?(click).should == true
|
310
|
+
end
|
311
|
+
|
312
|
+
it "should return false if account_id is an empty string" do
|
313
|
+
click = { "value" => {"account_id" => "", "campaign_data" => {"iid" => "1234", "kid" => "56342"}}}
|
314
|
+
is_valid_inimage_report?(click).should == false
|
315
|
+
end
|
316
|
+
|
317
|
+
it "should raise ArgumentError if value exists and account_id is nil" do
|
318
|
+
click = { "value" => {"campaign_data" => {"iid" => "1234", "kid" => "56342"}}}
|
319
|
+
lambda { is_valid_impression?(click)}.should raise_error(ArgumentError)
|
320
|
+
end
|
321
|
+
|
322
|
+
it "should raise ArgumentError if value doesn't exist'" do
|
323
|
+
imp = {"category" => "inimage", "campaign_data" => {"iid" => "1234", "kid" => "56342"}}
|
324
|
+
lambda { is_valid_impression?(imp)}.should raise_error(ArgumentError)
|
325
|
+
end
|
326
|
+
|
327
|
+
end
|
328
|
+
end
|