require 'test_helper' class SerializationTest < ActiveSupport::TestCase ResultItem = BentoSearch::ResultItem MockEngine = BentoSearch::MockEngine setup do @init_hash = {:title => "something", :unique_id => "AAA11212", :openurl_disabled => true, :link => "http://www.example.org/something", :link_is_fulltext => true, :format => "Article", :year => 2000, :publication_date => Date.new(2000,1,1), :volume => "10", :issue => "22", :start_page => "122", :end_page => "124", :language_code => "en", :language_str => "English 22", :source_title => "Journal of Things", :issn => "12345678", :isbn => "1234567890", :oclcnum => "1", :doi => "10.2.whatever", :pmid => "12121212", :publisher => "Joe Blow", :abstract => "something or other", :openurl_kev_co => "&rft.fake=fake", :format_str => "Something or other", :custom_data => {'foo' => "bar"}, :snippets => ["snippet one", "snippet two"]} @result_item = ResultItem.new(@init_hash) end def test_item_serialization r = ResultItem.new(@init_hash) hash = r.internal_state_hash r2 = ResultItem.from_internal_state_hash(hash) assert_kind_of ResultItem, r2 @init_hash.each_pair do |key, value| assert_equal value, r2.instance_variable_get("@#{key}") end end class ::SerializationTest::ExampleDecorator < BentoSearch::StandardDecorator def title "DECORATED TITLE" end end def test_item_serialization_not_decorated r = ::SerializationTest::ExampleDecorator.new(ResultItem.new(@init_hash), nil) assert_equal "DECORATED TITLE", r.title hash = r.internal_state_hash assert_present hash["title"] refute_equal "DECORATED TITLE", hash["title"] end def test_author_serialization hash = {:first => "Jonathan", :last => "Rochkind", :middle => "A", :display => "Rochkind, Jonathan A."} a = BentoSearch::Author.new(hash) a2 = BentoSearch::Author.load_json( a.dump_to_json ) hash.each_pair do |key, value| assert_equal value, a2.send(key) end end def test_item_json_serialization json_str = @result_item.dump_to_json assert_kind_of String, json_str r2 = ResultItem.load_json(json_str) @init_hash.each_pair do |key, value| assert_equal value, r2.instance_variable_get("@#{key}") end end def test_item_html_safe_serialization r = ResultItem.new(:title => "foo".html_safe) r2 = ResultItem.load_json( r.dump_to_json ) assert r2.title.html_safe? assert_equal "foo", r2.title end def test_result_item_authors r = ResultItem.new(:title => "foo") r.authors << BentoSearch::Author.new(:first => "Jonathan", :last => "Rochkind") hash = r.internal_state_hash assert_kind_of Array, hash['authors'] hash['authors'].each do |item| assert_kind_of Hash, item end json_str = r.dump_to_json assert_kind_of String, json_str r2 = ResultItem.load_json( json_str ) assert_kind_of Array, r2.authors assert r2.authors.length == 1 au = r2.authors.first assert_kind_of BentoSearch::Author, au assert_equal "Jonathan", au.first assert_equal "Rochkind", au.last end def test_result_item_other_links r = ResultItem.new(:title => "foo") r.other_links << BentoSearch::Link.new(:url => "http://example.org") r2 = ResultItem.load_json( r.dump_to_json ) assert_kind_of Array, r2.other_links assert r2.other_links.length == 1 l = r2.other_links.first assert_kind_of BentoSearch::Link, l assert_equal "http://example.org", l.url end def test_item_year_and_date r = ResultItem.new(:title => "foo", :year => 1991, :publication_date => Date.new(1991, 5, 1)) r2 = ResultItem.load_json( r.dump_to_json ) assert_equal 1991, r2.year assert_equal Date.new(1991, 5, 1), r2.publication_date end class Results < ActionController::TestCase test "serialize" do engine = MockEngine.new(:id => "foo", :for_display => {:foo => "bar", :nested => {"one" => "two"}} ) results = engine.search("foo") assert_kind_of Hash, results.internal_state_hash assert_equal "foo", results.internal_state_hash["engine_id"] assert_kind_of Array, results.internal_state_hash["result_items"] assert_kind_of String, results.dump_to_json assert_equal results.internal_state_hash, JSON.parse(results.dump_to_json) end test "de-serialize with no engine ID" do engine = MockEngine.new( :for_display => {:foo => "bar", :nested => {"one" => "two"}} ) results = engine.search("foo") hash = results.internal_state_hash restored = BentoSearch::Results.from_internal_state_hash(hash) assert_kind_of BentoSearch::Results, restored assert_equal results.size, restored.size #assert_equal "foo", restored.engine_id json_str = results.dump_to_json assert_kind_of String, json_str assert_kind_of BentoSearch::Results, BentoSearch::Results.load_json(json_str) end test "de-serialized can be configured for any engine" do create_engine = MockEngine.new() restore_engine = MockEngine.new( :id => "MyMockEngine", :for_display => {:foo => "bar", :nested => {"one" => "two"}, :decorator => "SomeDecorator"} ) json = create_engine.search("foo").dump_to_json restored = BentoSearch::Results.load_json(json) restore_engine.fill_in_search_metadata_for(restored) assert_equal "MyMockEngine", restored.engine_id assert_equal restore_engine.configuration.for_display, restored.display_configuration assert restored.length > 0 restored.each do |item| assert_equal "MyMockEngine", item.engine_id assert_equal restore_engine.configuration.for_display, item.display_configuration assert_equal "SomeDecorator", item.decorator end end class RegisteredEngineTest < ActionController::TestCase def setup BentoSearch.register_engine("mock") do |config| config.engine = "MockEngine" config.for_display = {:foo => "bar", :nested => {"one" => "two"}, :decorator => "SomeDecorator"} end end def teardown BentoSearch.reset_engine_registrations! end test "de-serializes with a registered engine ID, restoring context" do mock_engine = BentoSearch.get_engine("mock") results = mock_engine.search("query") json_str = results.dump_to_json assert_kind_of String, json_str restored = BentoSearch::Results.load_json(json_str) assert_kind_of BentoSearch::Results, restored assert_equal "mock", restored.engine_id assert_equal mock_engine.configuration.for_display, restored.display_configuration assert restored.length > 0 restored.each do |item| assert_equal "mock", item.engine_id assert_equal mock_engine.configuration.for_display, item.display_configuration assert_equal "SomeDecorator", item.decorator end end end end end