Remove dated config.gem
[gitorious:pkong23s-mainline.git] / test / unit / lib / gitorious / search_test.rb
1 # encoding: utf-8
2 #--
3 #   Copyright (C) 2011 Gitorious AS
4 #
5 #   This program is free software: you can redistribute it and/or modify
6 #   it under the terms of the GNU Affero General Public License as published by
7 #   the Free Software Foundation, either version 3 of the License, or
8 #   (at your option) any later version.
9 #
10 #   This program is distributed in the hope that it will be useful,
11 #   but WITHOUT ANY WARRANTY; without even the implied warranty of
12 #   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 #   GNU Affero General Public License for more details.
14 #
15 #   You should have received a copy of the GNU Affero General Public License
16 #   along with this program.  If not, see <http://www.gnu.org/licenses/>.
17 #++
18
19 require "test_helper"
20 class SearchTest < ActiveSupport::TestCase
21   
22   context "Using Ultrasphinx" do
23     Gitorious::Search.use Gitorious::Search::Ultrasphinx::Adapter
24
25     # A sample indexed model
26     class Searchable < ActiveRecord::Base
27       include Gitorious::Search
28       is_indexed(:fields => {})
29     end
30
31     should "call into Ultrasphinx" do
32       assert_not_nil Ultrasphinx::MODEL_CONFIGURATION["SearchTest::Searchable"]
33     end    
34   end
35
36   context "Specifying associations" do
37     should "index a single attribute" do
38       helper = Gitorious::Search::Ultrasphinx::SearchHelper.new do |h|
39         h.index :body
40       end
41       assert_equal 1, helper.arguments.size
42       arg = helper.arguments.first
43       assert_equal :fields, arg.method_name
44       assert_equal :body, arg.arguments
45     end
46
47     should "index by association" do
48       helper = Gitorious::Search::Ultrasphinx::SearchHelper.new do |h|
49         h.index "user#login", :as => :commented_by
50       end
51
52       arg = helper.arguments.first
53       assert_equal :include, arg.method_name
54       assert_equal({:association_name => "user", :field => "login", :as => "commented_by"}, arg.arguments)
55     end
56
57     should "group options" do
58       helper = Gitorious::Search::Ultrasphinx::SearchHelper.new do |h|
59         h.index :body
60         h.index :name
61         h.index "user#login", :as => :commented_by
62       end
63
64       assert_equal [:body, :name], helper.options[:fields]
65       assert_equal [{:association_name => "user", :field => "login", :as => "commented_by"}], helper.options[:include]
66     end
67
68     should "support conditions" do
69       helper = Gitorious::Search::Ultrasphinx::SearchHelper.new do |h|
70         h.conditions "name IS NOT NULL"
71       end
72       assert_equal "name IS NOT NULL", helper.options[:conditions]
73     end
74
75     should "support fields with a custom name" do
76       helper = Gitorious::Search::Ultrasphinx::SearchHelper.new do |h|
77         h.index :status_tag, :as => "status"
78         h.index :name
79       end
80       assert_equal([{:field => "status_tag", :as => "status"}, :name], helper.options[:fields])
81     end
82
83     should "support concatenation" do
84       helper = Gitorious::Search::Ultrasphinx::SearchHelper.new do |h|
85         h.collect(
86           :name, :from => "Tag", :as => "category",
87           :using => "LEFT OUTER JOIN taggings on taggings.id=project.id")
88       end
89       a = helper.options[:concatenate].first
90       assert_equal "name", a[:field]
91       assert_equal "Tag", a[:class_name]
92       assert_equal "category", a[:as]
93     end
94
95   end
96
97   context "Calling Ultrasphinx" do
98     
99     class SampleSearchable < ActiveRecord::Base
100       include Gitorious::Search
101     end
102     
103     should "handle a single field" do
104       SampleSearchable.expects(:is_indexed_ultrasphinx).with(:fields => [:body])
105       SampleSearchable.is_indexed {|s| s.index(:body)}
106     end
107
108     should "handle associations" do
109       SampleSearchable.expects(:is_indexed_ultrasphinx).with(:include => [{:association_name => "user", :field => "login", :as => "commented_by"}])
110       SampleSearchable.is_indexed {|s| s.index("user#login", :as => :commented_by)}
111     end
112
113     should "handle both fields and associations" do
114       SampleSearchable.expects(:is_indexed_ultrasphinx).with(
115         :fields => [:body],
116         :include => [
117                      {:association_name => "user",
118                        :field => "login",
119                        :as => "commented_by"}])
120       SampleSearchable.is_indexed do |s|
121         s.index :body
122         s.index "user#login", :as => :commented_by
123       end
124     end
125   end
126
127   context "Solr search helper" do
128
129     class SunspotSearchable
130       extend Gitorious::Search::Sunspot::Adapter
131     end
132
133     should "index associated fields" do
134       SunspotSearchable.expects(:searchable).yields(SunspotSearchable)
135       SunspotSearchable.expects(:text).with(:commented_by).yields(SunspotSearchable)
136       
137       SunspotSearchable.is_indexed do |s|
138         s.index "user#login", :as => :commented_by
139       end
140     end
141
142     should "index a single field" do
143       SunspotSearchable.expects(:searchable).yields(SunspotSearchable)
144       SunspotSearchable.expects(:text).with(:title)
145       
146       SunspotSearchable.is_indexed do |s|
147         s.index :title
148       end
149     end
150   end
151 end