spec/lib/prosperity/metric_spec.rb in prosperity-0.0.1 vs spec/lib/prosperity/metric_spec.rb in prosperity-0.0.2
- old
+ new
@@ -14,11 +14,77 @@
end
it "gets the scope" do
subject.scope.should == User
end
+
+ it "should not be sql" do
+ subject.should_not be_sql
+ end
+
+ it "should have the default aggregate" do
+ subject.aggregate.should be_an(Aggregate::Count)
+ end
end
+
+ context "A raw sql metric" do
+ context "From a string" do
+ subject do
+ Class.new(Metric) do
+ sql "SELECT name, created_at FROM users"
+ end.new
+ end
+
+ it "groups by created_at by default" do
+ subject.group_by.should == :created_at
+ end
+
+ it "gets the scope" do
+ subject.sql.should == "SELECT name, created_at FROM users"
+ end
+
+ it "raises an exception when adding an option" do
+ expect {
+ subject.class.option "active" do |scope|
+ scope.active
+ end
+ }.to raise_exception(SqlMetricCannotHaveOption)
+ end
+
+ it "should be sql" do
+ subject.should be_sql
+ end
+ end
+
+ context "From a block" do
+ subject do
+ Class.new(Metric) do
+ sql { "SELECT name, created_at FROM users" }
+ end.new
+ end
+
+ it "groups by created_at by default" do
+ subject.group_by.should == :created_at
+ end
+
+ it "gets the scope" do
+ subject.sql.should == "SELECT name, created_at FROM users"
+ end
+
+ it "raises an exception when adding an option" do
+ expect {
+ subject.class.option "active" do |scope|
+ scope.active
+ end
+ }.to raise_exception(SqlMetricCannotHaveOption)
+ end
+
+ it "should be sql" do
+ subject.should be_sql
+ end
+ end
+ end
context "a metric missing the scope" do
subject do
Class.new(Metric) do
end
@@ -27,23 +93,82 @@
it "raises an exception when accessing the scope" do
expect { subject.scope }.to raise_exception(MissingScope)
end
end
+ context "a metric missing the sql" do
+ subject do
+ Class.new(Metric) do
+ end
+ end
+
+ it "raises an exception when accessing the sql" do
+ expect { subject.sql }.to raise_exception(MissingSql)
+ end
+ end
+
context "A simple scope metric with multiple options" do
subject do
Class.new(Metric) do
scope { User }
- options "active" do |scope|
+ option "active" do |scope|
scope.active
end
end.new
end
it "should have multiple options" do
subject.options.size.should == 2
subject.options['default'].should be_present
subject.options['active'].should be_present
+ end
+ end
+
+ context "A metric with a custom group by" do
+ subject do
+ Class.new(Metric) do
+ scope { User }
+ group_by "users.created_at"
+ end.new
+ end
+
+ its(:group_by) { should == 'users.created_at' }
+ end
+
+ context "A metric with a a sum aggregate" do
+ subject do
+ Class.new(Metric) do
+ scope { User }
+ aggregate { sum(:some_column) }
+ end.new
+ end
+
+ let(:aggregate) { subject.aggregate }
+
+ it "has the correct aggregate info" do
+ aggregate.should be_an(Aggregate::Sum)
+ aggregate.column.should == :some_column
+ end
+ end
+
+ context "a ruby code metric" do
+ subject do
+ Class.new(Metric) do
+ value_at do |time, period, option|
+ :expected
+ end
+ end.new
+ end
+
+ it "has the correct value_at info" do
+ subject.value_at.call.should == :expected
+ end
+
+ describe ".ruby?" do
+ it "should be true" do
+ subject.class.ruby?.should == true
+ subject.ruby?.should == true
+ end
end
end
end
end