| # The ASF licenses this file to You under the Apache License, Version 2.0 |
| # (the "License"); you may not use this file except in compliance with |
| # the License. You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| |
| require 'test/unit' |
| require 'solr' |
| |
| class BadRequest < Solr::Request::Standard |
| def response_format |
| :invalid |
| end |
| end |
| |
| class ServerTest < Test::Unit::TestCase |
| include Solr |
| |
| def setup |
| @connection = Connection.new("http://localhost:8888/solr", :autocommit => :on) |
| clean |
| end |
| |
| def test_full_lifecycle |
| # make sure autocommit is on |
| assert @connection.autocommit |
| |
| # make sure this doc isn't there to begin with |
| @connection.delete(123456) |
| |
| # add it |
| @connection.add(:id => 123456, :text => 'Borges') # add :some_date => 'NOW/HOUR' to test richer data type handling |
| # now = DateTime.now |
| |
| # look for it |
| response = @connection.query('Borges') |
| assert_equal 1, response.total_hits |
| hit = response.hits[0] |
| assert_equal '123456', hit['id'] |
| # assert_equal now.year, hit['whatever_date'].year |
| |
| # look for it via dismax |
| response = @connection.search('Borges') |
| assert_equal 1, response.total_hits |
| assert_equal '123456', response.hits[0]['id'] |
| |
| # delete it |
| @connection.delete(123456) |
| |
| # make sure it's gone |
| response = @connection.query('Borges') |
| assert_equal 0, response.total_hits |
| end |
| |
| def test_i18n_full_lifecycle |
| # make sure autocommit is on |
| assert @connection.autocommit |
| |
| # make sure this doc isn't there to begin with |
| @connection.delete(123456) |
| |
| # add it |
| @connection.add(:id => 123456, :text => 'Åäöêâîôû') |
| |
| # look for it |
| response = @connection.query('Åäöêâîôû') |
| assert_equal 1, response.total_hits |
| assert_equal '123456', response.hits[0]['id'] |
| |
| # delete it |
| @connection.delete(123456) |
| |
| # make sure it's gone |
| response = @connection.query('Åäöêâîôû Öëäïöü') |
| assert_equal 0, response.total_hits |
| end |
| |
| def test_sorting |
| @connection.add(:id => 1, :text => 'aaa woot') |
| @connection.add(:id => 2, :text => 'bbb woot') |
| @connection.add(:id => 3, :text => 'ccc woot') |
| @connection.commit |
| |
| results = @connection.query('woot', :sort => [:id => :descending], :rows => 2) |
| assert_equal([3, 2], results.hits.map { |h| h['id'].to_i }) |
| |
| results = @connection.search('woot', :sort => [:id => :descending], :rows => 2) |
| assert_equal([3, 2], results.hits.map { |h| h['id'].to_i }) |
| |
| @connection.delete_by_query("id:1 OR id:2 OR id:3") |
| end |
| |
| def test_bad_connection |
| conn = Solr::Connection.new 'http://127.0.0.1:9999/invalid' |
| begin |
| conn.send(Solr::Request::Ping.new) |
| flunk "Expected exception not raised" |
| rescue ::Exception |
| # expected |
| assert true |
| end |
| end |
| |
| def test_bad_url |
| conn = Solr::Connection.new 'http://localhost:8888/invalid' |
| assert_raise(Net::HTTPServerException) do |
| conn.send(Solr::Request::Ping.new) |
| end |
| end |
| |
| def test_commit |
| response = @connection.send(Solr::Request::Commit.new) |
| assert response.ok? |
| end |
| |
| def test_optimize |
| response = @connection.send(Solr::Request::Optimize.new) |
| assert response.ok? |
| end |
| |
| # TODO: add test_ping back... something seems to have changed with the response, so adjustments are needed. |
| # non-critical - if Solr is broken we'll know from other tests! |
| # def test_ping |
| # assert_equal true, @connection.ping |
| # end |
| |
| def test_delete_with_query |
| assert_equal true, @connection.delete_by_query('[* TO *]') |
| end |
| |
| def test_ping_with_bad_server |
| conn = Solr::Connection.new 'http://localhost:8888/invalid' |
| assert_equal false, conn.ping |
| end |
| |
| def test_invalid_response_format |
| request = BadRequest.new(:query => "solr") |
| assert_raise(Solr::Exception) do |
| @connection.send(request) |
| end |
| end |
| |
| def test_escaping |
| doc = Solr::Document.new :id => 47, :ruby_text => 'puts "ouch!"' |
| @connection.add(doc) |
| @connection.commit |
| |
| request = Solr::Request::Standard.new :query => 'ouch' |
| result = @connection.send(request) |
| |
| assert_match /puts/, result.raw_response |
| end |
| |
| def test_add_document |
| doc = {:id => 999, :text => 'hi there!'} |
| request = Solr::Request::AddDocument.new(doc) |
| response = @connection.send(request) |
| assert response.status_code == '0' |
| end |
| |
| def test_update |
| @connection.update(:id => 999, :text => 'update test') |
| end |
| |
| def test_no_such_field |
| doc = {:id => 999, :bogus => 'foo'} |
| request = Solr::Request::AddDocument.new(doc) |
| assert_raise(Net::HTTPServerException) do |
| response = @connection.send(request) |
| end |
| # assert_equal false, response.ok? |
| # assert_match "ERROR:unknown field 'bogus'", response.status_message |
| end |
| |
| def test_index_info |
| doc = {:id => 999, :test_index_facet => 'value'} |
| @connection.add(doc) |
| ii = Solr::Request::IndexInfo.new |
| info = @connection.send(Solr::Request::IndexInfo.new) |
| assert info.field_names.include?("id") && info.field_names.include?("test_index_facet") |
| assert_equal 1, info.num_docs |
| end |
| |
| def test_highlighting |
| @connection.add(:id => 1, :title_text => "Apache Solr") |
| |
| request = Solr::Request::Standard.new(:query => 'solr', |
| :highlighting => { |
| :field_list => ['title_text'], |
| :max_snippets => 3, |
| :prefix => ">>", |
| :suffix => "<<" |
| } |
| ) |
| |
| response = @connection.send(request) |
| assert_equal ["Apache >>Solr<<"], response.highlighted(1, :title_text) |
| end |
| |
| def test_entities |
| @connection.add(:id => 1, :title_text => " ") |
| response = @connection.query('nbsp') |
| assert_equal 1, response.total_hits |
| assert_equal '1', response.hits[0]['id'] |
| end |
| |
| # wipe the index clean |
| def clean |
| @connection.delete_by_query('*:*') |
| end |
| |
| end |