testing/rspec/spec/dsl_spec.rb in cql-1.4.2 vs testing/rspec/spec/dsl_spec.rb in cql-1.5.0

- old
+ new

@@ -9,22 +9,22 @@ describe 'invalid query structure' do it "will complain if no 'from' clause is specified" do - gs = CQL::Repository.new("#{@feature_fixtures_directory}/scenario/simple") + gs = CQL::Repository.new("#{CQL_FEATURE_FIXTURES_DIRECTORY}/scenario/simple") expect { gs.query do select features end }.to raise_error(ArgumentError, "A query must specify a 'from' clause") end it "will complain if no 'select' clause is specified" do - gs = CQL::Repository.new("#{@feature_fixtures_directory}/scenario/simple") + gs = CQL::Repository.new("#{CQL_FEATURE_FIXTURES_DIRECTORY}/scenario/simple") expect { gs.query do from features end @@ -37,11 +37,11 @@ describe 'clause ordering' do it 'handles intermixed clauses' do # Clause ordering doesn't matter as long as any given type of clause is ordered correctly with respect to its multiple uses - gs = CQL::Repository.new("#{@feature_fixtures_directory}/scenario/simple") + gs = CQL::Repository.new("#{CQL_FEATURE_FIXTURES_DIRECTORY}/scenario/simple") results = gs.query do with { |scenario| scenario.name =~ /slurping/ } as thing1 transform :self => lambda { |thing1| 1 } @@ -53,581 +53,9 @@ transform :self => lambda { |thing2| 2 } select name end expect(results.first).to eq('thing1' => 1, 'thing2' => 2, 'name' => 'Testing the slurping 3') - end - - end - - - describe "select" do - - it 'knows how to select attributes' do - expect(dsl_enabled_object).to respond_to(:select) - end - - it 'selects one or more attributes' do - expect(dsl_enabled_object.method(:select).arity).to eq(-1) - end - - it 'correctly selects a single attribute from a model' do - model = CukeModeler::CqlTestModel.new - model.attribute_1 = 'foo' - - repo = CQL::Repository.new(model) - - result = repo.query do - select attribute_1 - from cql_test_model - end - - - expect(result).to eq([{'attribute_1' => 'foo'}]) - end - - it 'correctly selects multiple attributes from a model' do - model = CukeModeler::CqlTestModel.new - model.attribute_1 = 'foo' - model.attribute_2 = 'bar' - - repo = CQL::Repository.new(model) - - result = repo.query do - select attribute_1, attribute_2 - from cql_test_model - end - - - expect(result).to eq([{'attribute_1' => 'foo', - 'attribute_2' => 'bar'}]) - end - - - describe 'special attributes' do - - it 'understands the :model attribute' do - gs = CQL::Repository.new("#{@feature_fixtures_directory}/scenario/simple") - - expect { gs.query do - select :model - from features - end - }.to_not raise_error - end - - it 'interprets :model in the same manner that it interprets :self' do - gs = CQL::Repository.new("#{@feature_fixtures_directory}/scenario/simple") - - self_result = gs.query do - select :self - from features - end - - model_result = gs.query do - select :model - from features - end - - # Only checking the values of the results because they will have different :model/:self keys - expect(model_result.collect { |result| result.values }).to eq(self_result.collect { |result| result.values }) - end - - it 'complains if an unknown special attribute is queried' do - gs = CQL::Repository.new("#{@feature_fixtures_directory}/scenario/simple") - - expect { - gs.query do - select :foo - from scenarios - end - }.to raise_error(ArgumentError, ":foo is not a valid attribute for selection.") - end - - it 'uses the :self attribute by default' do - gs = CQL::Repository.new("#{@feature_fixtures_directory}/scenario/simple") - - default_result = gs.query do - select - from features - end - - self_result = gs.query do - select :self - from features - end - - expect(self_result).to eq(default_result) - end - - end - - - it 'complains if an unknown normal attribute is queried' do - gs = CQL::Repository.new("#{@feature_fixtures_directory}/scenario/simple") - - expect { - gs.query do - select steps - from features - end - }.to raise_error(ArgumentError, "'steps' is not a valid attribute for selection from a 'CukeModeler::Feature'.") - end - - - describe "multiple selections" do - - it 'can freely mix empty selections and attribute selections' do - gs = CQL::Repository.new("#{@feature_fixtures_directory}/scenario/simple") - - base_result = gs.query do - select :self - select name - select :self - as 'foo', 'bar', 'baz' - from scenarios - end - - - expect( - gs.query do - select - select name - select - as 'foo', 'bar', 'baz' - from scenarios - end - ).to eq(base_result) - end - - end - - - describe 'duplicate selections' do - - let(:warning_message) { "Multiple selections made without using an 'as' clause\n" } - - it "warns if the same attribute is selected more than once without an 'as' clause being used" do - gs = CQL::Repository.new("#{@feature_fixtures_directory}/scenario/simple") - - expect { - gs.query do - select :model, :model, :model - from :all - end - }.to output(warning_message).to_stderr - end - - it "does not warn if the same attribute is selected more than once and an 'as' clause is used" do - gs = CQL::Repository.new("#{@feature_fixtures_directory}/scenario/simple") - - expect { - gs.query do - select :model, :model, :model - # Usage of the clause is sufficient. Not going to try and count the mappings or anything like that. - as foo - from :all - end - }.to_not output(warning_message).to_stderr - end - - end - - end - - describe "from" do - - it 'knows from what to select attributes' do - expect(dsl_enabled_object).to respond_to(:from) - end - - it 'selects from one or more things' do - expect(dsl_enabled_object.method(:from).arity).to eq(-1) - end - - it "can handle an empty 'from' clause" do - gs = CQL::Repository.new("#{@feature_fixtures_directory}/scenario/simple") - - result = gs.query do - select name - from - end - - expect(result).to eq([]) - end - - describe "multiple targets" do - - it 'raises an exception for inapplicable attributes' do - gs = CQL::Repository.new("#{@feature_fixtures_directory}/scenario/simple") - - expect { - gs.query do - select name, steps - from features - from scenarios - end - }.to raise_error(ArgumentError) - end - - end - - describe 'shorthand' do - - it 'should consider an exact match over a pluralization' do - plural_class_model = CukeModeler::CqlTestModels.new - singular_class_model = CukeModeler::CqlTestModel.new - - plural_class_model.attribute_1 = 'plural' - singular_class_model.attribute_1 = 'singular' - plural_class_model.children << singular_class_model - - repo = CQL::Repository.new(plural_class_model) - - result = repo.query do - select attribute_1 - from cql_test_model - end - - expect(result.first['attribute_1']).to eq('singular') - end - - it 'raises an exception if the shorthand form of a class cannot be mapped to a real class' do - gs = CQL::Repository.new("#{@feature_fixtures_directory}/scenario/simple") - - expect { - gs.query do - select name - from not_a_real_class - end - }.to raise_error(ArgumentError, "Class 'CukeModeler::NotARealClass' does not exist") - - end - - it 'can freely mix shorthand and long-form names' do - gs = CQL::Repository.new("#{@feature_fixtures_directory}/scenario/simple") - - # All long-form - base_result = gs.query do - select name - from CukeModeler::Scenario, CukeModeler::Feature - end - - # All shorthand - expect( - gs.query do - select name - from scenarios, features - end - ).to eq(base_result) - - # A mix of both - expect( - gs.query do - select name - from CukeModeler::Scenario, features - end - ).to eq(base_result) - end - - end - - - describe 'special scopes' do - - it 'understands the :all scope' do - gs = CQL::Repository.new("#{@feature_fixtures_directory}/scenario/simple") - - expect { gs.query do - select :model - from :all - end - }.to_not raise_error - end - - it 'queries from all models when scoped to :all' do - model_1 = CukeModeler::CqlTestModel.new - model_2 = CukeModeler::CqlTestModel.new - model_3 = CukeModeler::CqlTestModel.new - - model_1.children << model_2 - model_1.children << model_3 - - repo = CQL::Repository.new(model_1) - - result = repo.query do - select :model - from :all - end - - expect(result).to match_array([{:model => model_1}, - {:model => model_2}, - {:model => model_3}]) - end - - end - - end - - describe "transform" do - - describe "multiple targets" do - - it 'does not apply more transforms than have been declared' do - gs = CQL::Repository.new("#{@feature_fixtures_directory}/scenario/simple") - - results = gs.query do - select :self, :self, :self - as thing1, thing2, thing3 - from scenarios - transform :self => lambda { |thing1| 1 } - transform :self => lambda { |thing2| 2 } - end - - expect(results.first).to include('thing1' => 1, 'thing2' => 2) - expect(results.first).to_not include('thing3' => 1) - expect(results.first).to_not include('thing3' => 2) - end - - end - - end - - - describe 'with' do - - it 'knows how to filter selections with certain qualities' do - expect(dsl_enabled_object).to respond_to(:with) - end - - - describe 'targeted' do - - it 'can handle predefined filters' do - gs = CQL::Repository.new(@feature_fixtures_directory) - - expect { - gs.query do - select name - from features, scenarios, outlines - with scenarios => name(/test/) - end - }.to_not raise_error - end - - it 'can handle a block filter' do - gs = CQL::Repository.new(@feature_fixtures_directory) - - expect { - gs.query do - select name - from features, scenarios, outlines - with scenarios => lambda { |scenario| true } - end - }.to_not raise_error - end - - it 'correctly filters with a targeted block' do - gs = CQL::Repository.new(@feature_fixtures_directory) - - result = gs.query do - select name - from scenarios - with scenarios => lambda { |scenario| scenario.name =~ /king of/ } - end - - expect(result).to eq([{'name' => 'The king of kings'}]) - end - - it 'can handle shorthand targets' do - gs = CQL::Repository.new(@feature_fixtures_directory) - - expect { - gs.query do - select name - from features, scenarios, outlines - with scenarios => name(/test/) - end - }.to_not raise_error - end - - it 'can handle multiple targets' do - gs = CQL::Repository.new(@feature_fixtures_directory) - - expect { - gs.query do - select name - from features, scenarios, outlines - with scenarios => lambda { |scenario| true }, - outlines => lambda { |outline| true } - end - }.to_not raise_error - end - - end - - end - - - describe 'without' do - - it 'knows how to filter selections without certain qualities' do - expect(dsl_enabled_object).to respond_to(:without) - end - - it 'correctly negates a block filter' do - gs = CQL::Repository.new("#{@feature_fixtures_directory}/scenario/simple") - - negated_result = gs.query do - select name - from scenarios - with { |scenario| !(scenario.source_line == 3) } - end - - without_result = gs.query do - select name - from scenarios - without { |scenario| scenario.source_line == 3 } - end - - expect(without_result).to eq(negated_result) - end - - it 'correctly negates a targeted filter' do - gs = CQL::Repository.new("#{@feature_fixtures_directory}/scenario/simple") - - negated_result = gs.query do - select :model - from features, scenarios - with scenarios => lambda { |scenario| false } - end - - without_result = gs.query do - select :model - from features, scenarios - without scenarios => lambda { |scenario| true } - end - - # puts "1: #{negated_result}" - - - expect(without_result).to eq(negated_result) - end - - - describe 'negating predefined filters' do - - it 'correctly negates a tag count filter' do - gs = CQL::Repository.new("#{@feature_fixtures_directory}/scenario/tags2") - - negated_result = gs.query do - select :model - from scenarios - with tc lt 2 - end - - without_result = gs.query do - select :model - from scenarios - without tc gt 1 - end - - expect(without_result).to eq(negated_result) - end - - it 'correctly negates a name filter' do - gs = CQL::Repository.new("#{@feature_fixtures_directory}/scenario/name_filter") - - negated_result = gs.query do - select :model - from scenarios - with name /name[^1]/ - end - - without_result = gs.query do - select :model - from scenarios - without name /name1/ - end - - expect(without_result).to eq(negated_result) - end - - it 'correctly negates a line filter' do - gs = CQL::Repository.new("#{@feature_fixtures_directory}/scenario/line_filter") - - negated_result = gs.query do - select name - from scenarios - with line 'green eggs and ham' - end - - without_result = gs.query do - select name - from scenarios - without line 'some other phrase' - end - - end - - it 'correctly negates a tag filter' do - gs = CQL::Repository.new("#{@feature_fixtures_directory}/scenario/tags3") - - negated_result = gs.query do - select :model - from scenarios - with tags '@one' - end - - without_result = gs.query do - select :model - from scenarios - without tags '@two' - end - - expect(without_result).to eq(negated_result) - end - - end - - it 'correctly negates a targeted, predefined filter' do - gs = CQL::Repository.new(@feature_fixtures_directory) - - negated_result = gs.query do - select :model - from :all - with scenarios => name(/(?!test)/) - end - - without_result = gs.query do - select :model - from :all - without scenarios => name(/test/) - end - - expect(without_result).to eq(negated_result) - end - - it 'correctly negates multiple filters' do - gs = CQL::Repository.new(@feature_fixtures_directory) - - negated_result = gs.query do - select :model - from :all - with scenarios => lambda { |scenario| false }, - outlines => lambda { |outline| false } - with { |model| !model.is_a?(CukeModeler::Example) } - end - - without_result = gs.query do - select :model - from :all - without scenarios => lambda { |scenario| true }, - outlines => lambda { |outline| true } - without { |model| model.is_a?(CukeModeler::Example) } - end - - expect(without_result).to eq(negated_result) end end end