spec/unit/thinking_sphinx/index/builder_spec.rb in freelancing-god-thinking-sphinx-1.1.12 vs spec/unit/thinking_sphinx/index/builder_spec.rb in freelancing-god-thinking-sphinx-1.1.14

- old
+ new

@@ -1,5 +1,351 @@ require 'spec/spec_helper' describe ThinkingSphinx::Index::Builder do - # + describe ".generate without source scope" do + before :each do + @index = ThinkingSphinx::Index::Builder.generate(Person) do + indexes first_name, last_name + has birthday + has id, :as => :internal_id + + set_property :sql_range_step => 1000 + + where "birthday <= NOW()" + group_by "first_name" + end + + @source = @index.sources.first + end + + it "should return an index" do + @index.should be_a_kind_of(ThinkingSphinx::Index) + end + + it "should have one source for the index" do + @index.sources.length.should == 1 + end + + it "should have two fields" do + @source.fields.length.should == 2 + @source.fields[0].unique_name.should == :first_name + @source.fields[1].unique_name.should == :last_name + end + + it "should have two attributes alongside the four internal ones" do + @source.attributes.length.should == 6 + @source.attributes[4].unique_name.should == :birthday + @source.attributes[5].unique_name.should == :internal_id + end + + it "should have one condition" do + @source.conditions.length.should == 1 + @source.conditions.first.should == "birthday <= NOW()" + end + + it "should have one grouping" do + @source.groupings.length.should == 1 + @source.groupings.first.should == "first_name" + end + + it "should have one option" do + @source.options.length.should == 1 + @source.options[:sql_range_step].should == 1000 + end + end + + describe "sortable field" do + before :each do + @index = ThinkingSphinx::Index::Builder.generate(Person) do + indexes first_name, :sortable => true + end + + @source = @index.sources.first + end + + it "should have one field" do + @source.fields.length.should == 1 + end + + it "should have one attribute alongside the four internal ones" do + @source.attributes.length.should == 5 + end + + it "should set the attribute name to have the _sort suffix" do + @source.attributes.last.unique_name.should == :first_name_sort + end + + it "should set the attribute column to be the same as the field" do + @source.attributes.last.columns.length.should == 1 + @source.attributes.last.columns.first.__name.should == :first_name + end + end + + describe "faceted field" do + before :each do + @index = ThinkingSphinx::Index::Builder.generate(Person) do + indexes first_name, :facet => true + end + + @source = @index.sources.first + end + + after :each do + Person.sphinx_facets.delete_at(-1) + end + + it "should have one field" do + @source.fields.length.should == 1 + end + + it "should have one attribute alongside the four internal ones" do + @source.attributes.length.should == 5 + end + + it "should set the attribute name to have the _facet suffix" do + @source.attributes.last.unique_name.should == :first_name_facet + end + + it "should set the attribute type to integer" do + @source.attributes.last.type.should == :integer + end + + it "should set the attribute column to be the same as the field" do + @source.attributes.last.columns.length.should == 1 + @source.attributes.last.columns.first.__name.should == :first_name + end + end + + describe "faceted integer attribute" do + before :each do + @index = ThinkingSphinx::Index::Builder.generate(Alpha) do + indexes :name + has value, :facet => true + end + + @source = @index.sources.first + end + + after :each do + Alpha.sphinx_facets.delete_at(-1) + end + + it "should have just one attribute alongside the four internal ones" do + @source.attributes.length.should == 5 + end + end + + describe "faceted timestamp attribute" do + before :each do + @index = ThinkingSphinx::Index::Builder.generate(Person) do + indexes first_name + has birthday, :facet => true + end + + @source = @index.sources.first + end + + after :each do + Person.sphinx_facets.delete_at(-1) + end + + it "should have just one attribute alongside the four internal ones" do + @source.attributes.length.should == 5 + end + end + + describe "faceted boolean attribute" do + before :each do + @index = ThinkingSphinx::Index::Builder.generate(Beta) do + indexes :name + has delta, :facet => true + end + + @source = @index.sources.first + end + + after :each do + Beta.sphinx_facets.delete_at(-1) + end + + it "should have just one attribute alongside the four internal ones" do + @source.attributes.length.should == 5 + end + end + + describe "faceted float attribute" do + before :each do + @index = ThinkingSphinx::Index::Builder.generate(Alpha) do + indexes :name + has cost, :facet => true + end + + @source = @index.sources.first + end + + after :each do + Alpha.sphinx_facets.delete_at(-1) + end + + it "should have just one attribute alongside the four internal ones" do + @source.attributes.length.should == 5 + end + end + + describe "faceted string attribute" do + before :each do + @index = ThinkingSphinx::Index::Builder.generate(Person) do + indexes first_name + has last_name, :facet => true + end + + @source = @index.sources.first + end + + after :each do + Person.sphinx_facets.delete_at(-1) + end + + it "should have two attributes alongside the four internal ones" do + @source.attributes.length.should == 6 + end + + it "should set the facet attribute name to have the _facet suffix" do + @source.attributes.last.unique_name.should == :last_name_facet + end + + it "should set the attribute type to integer" do + @source.attributes.last.type.should == :integer + end + + it "should set the attribute column to be the same as the field" do + @source.attributes.last.columns.length.should == 1 + @source.attributes.last.columns.first.__name.should == :last_name + end + end + + describe "no fields" do + it "should raise an exception" do + lambda { + ThinkingSphinx::Index::Builder.generate(Person) do + # + end + }.should raise_error + end + end + + describe "explicit source" do + before :each do + @index = ThinkingSphinx::Index::Builder.generate(Person) do + define_source do + indexes first_name, last_name + has birthday + has id, :as => :internal_id + + set_property :delta => true + + where "birthday <= NOW()" + group_by "first_name" + end + end + + @source = @index.sources.first + end + + it "should return an index" do + @index.should be_a_kind_of(ThinkingSphinx::Index) + end + + it "should have one source for the index" do + @index.sources.length.should == 1 + end + + it "should have two fields" do + @source.fields.length.should == 2 + @source.fields[0].unique_name.should == :first_name + @source.fields[1].unique_name.should == :last_name + end + + it "should have two attributes alongside the four internal ones" do + @source.attributes.length.should == 6 + @source.attributes[4].unique_name.should == :birthday + @source.attributes[5].unique_name.should == :internal_id + end + end + + describe "multiple sources" do + before :each do + @index = ThinkingSphinx::Index::Builder.generate(Person) do + define_source do + indexes first_name + has birthday + end + + define_source do + indexes last_name + has :id, :as => :internal_id + end + end + end + + it "should have two sources" do + @index.sources.length.should == 2 + end + + it "should have two fields" do + @index.fields.length.should == 2 + end + + it "should have one field in each source" do + @index.sources.each do |source| + source.fields.length.should == 1 + end + end + + it "should have two attributes alongside the eight internal ones" do + @index.attributes.length.should == 10 + end + + it "should have one attribute in each source alongside the four internal ones" do + @index.sources.each do |source| + source.attributes.length.should == 5 + end + end + end + + describe "index options" do + before :each do + @index = ThinkingSphinx::Index::Builder.generate(Person) do + indexes first_name + + set_property :charset_type => "utf16" + end + end + + it "should store the setting for the index" do + @index.local_options.length.should == 1 + @index.local_options[:charset_type].should == "utf16" + end + end + + describe "delta options" do + before :each do + @index = ThinkingSphinx::Index::Builder.generate(Person) do + indexes first_name + + set_property :delta => true + end + end + + it "should not keep the delta setting in source options" do + @index.sources.first.options.should be_empty + end + + it "should not keep the delta setting in index options" do + @index.local_options.should be_empty + end + + it "should set the index delta object set" do + @index.delta_object.should be_a_kind_of(ThinkingSphinx::Deltas::DefaultDelta) + end + end end \ No newline at end of file