kanbanworkflowstimelinescrumrubyroadmapproject-planningproject-managementopenprojectangularissue-trackerifcgantt-chartganttbug-trackerboardsbcf
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
176 lines
5.2 KiB
176 lines
5.2 KiB
require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
|
|
|
|
describe CostQuery do
|
|
before { @query = CostQuery.new }
|
|
|
|
fixtures :users
|
|
fixtures :cost_types
|
|
fixtures :cost_entries
|
|
fixtures :rates
|
|
fixtures :projects
|
|
fixtures :issues
|
|
fixtures :trackers
|
|
fixtures :time_entries
|
|
fixtures :enumerations
|
|
fixtures :issue_statuses
|
|
fixtures :roles
|
|
fixtures :issue_categories
|
|
fixtures :versions
|
|
|
|
describe :chain do
|
|
it "should contain NoFilter" do
|
|
@query.chain.should be_a(CostQuery::Filter::NoFilter)
|
|
end
|
|
|
|
it "should keep NoFilter at bottom" do
|
|
@query.filter :project_id
|
|
@query.chain.bottom.should be_a(CostQuery::Filter::NoFilter)
|
|
@query.chain.top.should_not be_a(CostQuery::Filter::NoFilter)
|
|
end
|
|
|
|
it "should not remember it's correct parent" do
|
|
@query.group_by :project_id
|
|
@query.filter :project_id
|
|
@query.chain.top.child.child.parent.should == @query.chain.top.child
|
|
end
|
|
|
|
it "should place filter after a group_by" do
|
|
@query.group_by :project_id
|
|
@query.chain.bottom.parent.should be_a(CostQuery::GroupBy::ProjectId)
|
|
@query.chain.top.should be_a(CostQuery::GroupBy::ProjectId)
|
|
|
|
@query.filter :project_id
|
|
@query.chain.bottom.parent.should be_a(CostQuery::Filter::ProjectId)
|
|
@query.chain.top.should be_a(CostQuery::GroupBy::ProjectId)
|
|
end
|
|
|
|
it "should place rows in front of columns when adding a column first" do
|
|
@query.column :project_id
|
|
@query.chain.bottom.parent.type.should == :column
|
|
@query.chain.top.type.should == :column
|
|
|
|
@query.row :project_id
|
|
@query.chain.bottom.parent.type.should == :column
|
|
@query.chain.top.type.should == :row
|
|
end
|
|
|
|
it "should place rows in front of columns when adding a row first" do
|
|
@query.row :project_id
|
|
@query.chain.bottom.parent.type.should == :row
|
|
@query.chain.top.type.should == :row
|
|
|
|
@query.column :project_id
|
|
@query.chain.bottom.parent.type.should == :column
|
|
@query.chain.top.type.should == :row
|
|
end
|
|
|
|
it "should place rows in front of filters" do
|
|
@query.row :project_id
|
|
@query.chain.bottom.parent.type.should == :row
|
|
@query.chain.top.type.should == :row
|
|
|
|
@query.filter :project_id
|
|
@query.chain.bottom.parent.should be_a(CostQuery::Filter::ProjectId)
|
|
@query.chain.top.should be_a(CostQuery::GroupBy::ProjectId)
|
|
@query.chain.top.type.should == :row
|
|
end
|
|
|
|
it "should place columns in front of filters" do
|
|
@query.column :project_id
|
|
@query.chain.bottom.parent.type.should == :column
|
|
@query.chain.top.type.should == :column
|
|
|
|
@query.filter :project_id
|
|
@query.chain.bottom.parent.should be_a(CostQuery::Filter::ProjectId)
|
|
@query.chain.top.should be_a(CostQuery::GroupBy::Base)
|
|
@query.chain.top.type.should == :column
|
|
end
|
|
end
|
|
|
|
describe CostQuery::Chainable do
|
|
describe :top do
|
|
before { @chain = CostQuery::Chainable.new }
|
|
|
|
it "returns for an one element long chain that chain as top" do
|
|
@chain.top.should == @chain
|
|
@chain.should be_top
|
|
end
|
|
|
|
it "does not keep the old top when prepending elements" do
|
|
CostQuery::Chainable.new @chain
|
|
@chain.top.should_not == @chain
|
|
@chain.should_not be_top
|
|
end
|
|
|
|
it "sets new top when prepending elements" do
|
|
current = @chain
|
|
10.times do
|
|
old, current = current, CostQuery::Chainable.new(current)
|
|
old.top.should == current
|
|
@chain.top.should == current
|
|
end
|
|
end
|
|
end
|
|
|
|
describe :inherited_attribute do
|
|
before do
|
|
@a = Class.new CostQuery::Chainable
|
|
@a.inherited_attribute :foo, :default => 42
|
|
@b = Class.new @a
|
|
@c = Class.new @a
|
|
@d = Class.new @b
|
|
end
|
|
|
|
it 'takes default argument' do
|
|
@a.foo.should == 42
|
|
@b.foo.should == 42
|
|
@c.foo.should == 42
|
|
@d.foo.should == 42
|
|
end
|
|
|
|
it 'inherits values' do
|
|
@a.foo 1337
|
|
@d.foo.should == 1337
|
|
end
|
|
|
|
it 'does not change values of parents and akin' do
|
|
@b.foo 1337
|
|
@a.foo.should_not == 1337
|
|
@c.foo.should_not == 1337
|
|
end
|
|
|
|
it 'is able to map values' do
|
|
@a.inherited_attribute :bar, :map => proc { |x| x*2 }
|
|
@a.bar 21
|
|
@a.bar.should == 42
|
|
end
|
|
|
|
describe :list do
|
|
it "merges lists" do
|
|
@a.inherited_attribute :bar, :list => true
|
|
@a.bar 1; @b.bar 1; @d.bar 1, 1
|
|
@a.bar.should == [1]
|
|
@b.bar.should == [1, 1]
|
|
@c.bar.should == [1]
|
|
@d.bar.should == [1, 1, 1, 1]
|
|
end
|
|
|
|
it "is able to map lists" do
|
|
@a.inherited_attribute :bar, :list => true, :map => :to_s
|
|
@a.bar 1; @b.bar 1; @d.bar 1
|
|
@a.bar.should == %w[1]
|
|
@b.bar.should == %w[1 1]
|
|
@c.bar.should == %w[1]
|
|
@d.bar.should == %w[1 1 1]
|
|
end
|
|
|
|
it "is able to produce uniq lists" do
|
|
@a.inherited_attribute :bar, :list => true, :uniq => true
|
|
@a.bar 1, 1, 2
|
|
@b.bar 2, 3
|
|
@b.bar.sort.should == [1, 2, 3]
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|