spec/mongoid/report/aggregation_spec.rb in mongoid-report-0.1.6 vs spec/mongoid/report/aggregation_spec.rb in mongoid-report-0.1.7

- old
+ new

@@ -10,11 +10,11 @@ it 'aggregates fields by app' do Report = Class.new do include Mongoid::Report attach_to Model do - aggregation_field :field1 + column :field1 end end klass.create!(field1: 1) klass.create!(field1: 1) @@ -31,11 +31,16 @@ it 'aggregates field by defined field of the mode' do klass.create!(day: today , field1: 1) klass.create!(day: today , field1: 1) klass.create!(day: yesterday , field1: 1) - example = Report3.new + Report = Class.new do + include Mongoid::Report + group_by :day, for: Model + column :field1, for: Model + end + example = Report.new rows = example.aggregate_for(klass) rows = rows.all expect(rows.size).to eq(2) @@ -50,11 +55,17 @@ klass.create(day: today , field1: 1 , field2: 2) klass.create(day: yesterday , field1: 1 , field2: 2) klass.create(day: two_days_ago , field1: 1 , field2: 2) klass.create(day: today , field1: 1 , field2: 3) - example = Report3.new + Report = Class.new do + include Mongoid::Report + group_by :day, for: Model + column :field1, for: Model + end + example = Report.new + scope = example.aggregate_for(Model) scope = scope.query('$match' => { :day => { '$gte' => yesterday.mongoize, '$lte' => today.mongoize } }) scope = scope.query('$match' => { :field2 => 2 }) scope = scope.yield scope = scope.query('$sort' => { day: -1 }) @@ -69,11 +80,17 @@ end it 'skips empty match in query' do klass.create(day: today , field1: 1 , field2: 2) - example = Report3.new + Report = Class.new do + include Mongoid::Report + group_by :day, for: Model + column :field1, for: Model + end + example = Report.new + scope = example.aggregate_for(Model) scope = scope.query() scope = scope.query({}) rows = scope.all @@ -82,32 +99,32 @@ expect(rows[0]['field1']).to eq(1) expect(rows[0]['day']).to eq(today) end end - class Report7 - include Mongoid::Report - - attach_to Model, as: 'example1' do - group_by :day - aggregation_field :field1 - end - - attach_to Model, as: 'example2' do - group_by :day - aggregation_field :field2 - end - end - describe '.aggregate' do it 'aggregates all defined groups in the report class' do klass.create(day: today , field1: 1 , field2: 2) klass.create(day: today , field1: 1 , field2: 2) klass.create(day: yesterday , field1: 1 , field2: 2) klass.create(day: two_days_ago , field1: 1 , field2: 2) - example = Report7.new + Report = Class.new do + include Mongoid::Report + + attach_to Model, as: 'example1' do + group_by :day + column :field1 + end + + attach_to Model, as: 'example2' do + group_by :day + column :field2 + end + end + + example = Report.new scope = example.aggregate scope .query('$match' => { :day => { '$gte' => yesterday.mongoize, '$lte' => today.mongoize } }) .yield .query('$sort' => { day: -1 }) @@ -126,33 +143,33 @@ expect(rows[0]['day']).to eq(today) expect(rows[1]['field2']).to eq(2) expect(rows[1]['day']).to eq(yesterday) end - class Report8 - include Mongoid::Report - - report 'example' do - attach_to Model, as: 'model1' do - group_by :day - aggregation_field :field1 - end - - attach_to Model, as: 'model2' do - group_by :day - aggregation_field :field2 - end - end - end - it 'should still aggregate with combined report' do klass.create(day: today , field1: 1 , field2: 2) klass.create(day: today , field1: 1 , field2: 2) klass.create(day: yesterday , field1: 1 , field2: 2) klass.create(day: two_days_ago , field1: 1 , field2: 2) - example = Report8.new + Report = Class.new do + include Mongoid::Report + + report 'example' do + attach_to Model, as: 'model1' do + group_by :day + column :field1 + end + + attach_to Model, as: 'model2' do + group_by :day + column :field2 + end + end + end + example = Report.new + scope = example.aggregate scope .query('$match' => { :day => { '$gte' => yesterday.mongoize, '$lte' => today.mongoize } }) .yield .query('$sort' => { day: -1 }) @@ -171,33 +188,33 @@ expect(rows[0]['day']).to eq(today) expect(rows[1]['field2']).to eq(2) expect(rows[1]['day']).to eq(yesterday) end - class Report11 - include Mongoid::Report - - report 'example' do - attach_to Model, as: 'model1' do - group_by :day - aggregation_field :field1, as: 'new-field1' - end - - attach_to Model, as: 'model2' do - group_by :day - aggregation_field :field2 - end - end - end - it 'should still aggregate with combined report and project using the new names' do klass.create(day: today , field1: 1 , field2: 2) klass.create(day: today , field1: 1 , field2: 2) klass.create(day: yesterday , field1: 1 , field2: 2) klass.create(day: two_days_ago , field1: 1 , field2: 2) - example = Report11.new + Report = Class.new do + include Mongoid::Report + + report 'example' do + attach_to Model, as: 'model1' do + group_by :day + column :field1, as: 'new-field1' + end + + attach_to Model, as: 'model2' do + group_by :day + column :field2 + end + end + end + example = Report.new + scope = example.aggregate scope .query('$match' => { :day => { '$gte' => yesterday.mongoize, '$lte' => today.mongoize } }) .yield .query('$sort' => { day: -1 }) @@ -217,103 +234,103 @@ expect(rows[1]['field2']).to eq(2) expect(rows[1]['day']).to eq(yesterday) end end - class Report15 - include Mongoid::Report - - filter field2: 2, for: Model - aggregation_field :field1, for: Model - end - describe '.filter' do it 'creates filter' do klass.create(field1: 1, field2: 2) klass.create(field1: 3, field2: 4) - example = Report15.new + Report = Class.new do + include Mongoid::Report + + filter field2: 2, for: Model + column :field1, for: Model + end + example = Report.new + scope = example.aggregate scope = scope.all rows = scope[Model] expect(rows.size).to eq(1) expect(rows[0]['field1']).to eq(1) end - class Report16 - include Mongoid::Report - - report 'example' do - attach_to Model do - filter field2: 2 - aggregation_field :field1 - end - end - end - it 'creates filter in report scope' do klass.create(field1: 1, field2: 2) klass.create(field1: 3, field2: 4) - example = Report16.new + Report = Class.new do + include Mongoid::Report + + report 'example' do + attach_to Model do + filter field2: 2 + column :field1 + end + end + end + + example = Report.new scope = example.aggregate scope = scope.all rows = scope['example-models'] expect(rows.size).to eq(1) expect(rows[0]['field1']).to eq(1) end - class Report17 - include Mongoid::Report - - report 'example' do - attach_to Model do - filter field2: 2, - day: ->(context) { Date.parse("20-12-2004").mongoize } - aggregation_field :field1 - end - end - end - it 'creates filter in report scope' do klass.create(day: today , field1: 1 , field2: 2) klass.create(day: yesterday , field1: 1 , field2: 2) klass.create(day: today , field1: 3 , field2: 4) - example = Report17.new + Report = Class.new do + include Mongoid::Report + + report 'example' do + attach_to Model do + filter field2: 2, + day: ->(context) { Date.parse("20-12-2004").mongoize } + column :field1 + end + end + end + example = Report.new + scope = example.aggregate scope = scope.all rows = scope['example-models'] expect(rows.size).to eq(1) expect(rows[0]['field1']).to eq(1) end - class Report18 - include Mongoid::Report - - def values - [1, 2] - end - - report 'example' do - attach_to Model do - group_by :day - filter field2: ->(context) { { '$in' => context.values } } - aggregation_field :field1 - end - end - end - it 'creates filter in report scope' do klass.create(day: today , field1: 1 , field2: 2) klass.create(day: today , field1: 1 , field2: 2) klass.create(day: yesterday , field1: 1 , field2: 2) klass.create(day: today , field1: 3 , field2: 4) - example = Report18.new + Report = Class.new do + include Mongoid::Report + + def values + [1, 2] + end + + report 'example' do + attach_to Model do + group_by :day + filter field2: ->(context) { { '$in' => context.values } } + column :field1 + end + end + end + example = Report.new + scope = example.aggregate scope = scope.all rows = scope['example-models'] expect(rows.size).to eq(2)