require File.expand_path(File.dirname(__FILE__) + '/test_helper') class CassandraTest < Test::Unit::TestCase include Cassandra::Constants def setup @twitter = Cassandra.new('Twitter', '127.0.0.1') @twitter.clear_keyspace! @blogs = Cassandra.new('Multiblog', '127.0.0.1') @blogs.clear_keyspace! @uuids = (0..6).map {|i| UUID.new(Time.at(2**(24+i))) } end def test_inspect assert_nothing_raised do @blogs.inspect @twitter.inspect end end def test_connection_reopens assert_raises(NoMethodError) do @twitter.insert(:Statuses, 1, {'body' => 'v'}) end assert_nothing_raised do @twitter.insert(:Statuses, key, {'body' => 'v'}) end end def test_get_key_name_sorted @twitter.insert(:Users, key, {'body' => 'v', 'user' => 'v'}) assert_equal({'body' => 'v', 'user' => 'v'}, @twitter.get(:Users, key)) assert_equal({}, @twitter.get(:Users, 'bogus')) end def test_get_key_name_sorted_preserving_order # In-order hash is preserved hash = OrderedHash['a', '', 'b', '', 'c', '', 'd', '',] @twitter.insert(:Users, key, hash) assert_equal(hash.keys, @twitter.get(:Users, key).keys) @twitter.remove(:Users, key) # Out-of-order hash is returned sorted hash = OrderedHash['b', '', 'c', '', 'd', '', 'a', ''] @twitter.insert(:Users, key, hash) assert_equal(hash.keys.sort, @twitter.get(:Users, key).keys) assert_not_equal(hash.keys, @twitter.get(:Users, key).keys) end def test_get_key_time_sorted @blogs.insert(:Blogs, key, {@uuids[0] => 'I like this cat'}) assert_equal({@uuids[0] => 'I like this cat'}, @blogs.get(:Blogs, key)) assert_equal({}, @blogs.get(:Blogs, 'bogus')) end def test_get_with_count @twitter.insert(:Statuses, key, {'1' => 'v', '2' => 'v', '3' => 'v'}) assert_equal 1, @twitter.get(:Statuses, key, :count => 1).size assert_equal 2, @twitter.get(:Statuses, key, :count => 2).size end def test_get_value @twitter.insert(:Statuses, key, {'body' => 'v'}) assert_equal 'v', @twitter.get(:Statuses, key, 'body') assert_nil @twitter.get(:Statuses, 'bogus', 'body') assert @twitter.exists?(:Statuses, key, 'body') assert_nil @twitter.exists?(:Statuses, 'bogus', 'body') end def test_get_super_key columns = {'user_timelines' => {@uuids[4] => '4', @uuids[5] => '5'}} @twitter.insert(:StatusRelationships, key, columns) assert_equal(columns, @twitter.get(:StatusRelationships, key)) assert_equal({}, @twitter.get(:StatusRelationships, 'bogus')) end def test_get_several_super_keys columns = { 'user_timelines' => {@uuids[1] => 'v1'}, 'mentions_timelines' => {@uuids[2] => 'v2'}} @twitter.insert(:StatusRelationships, key, columns) assert_equal(columns, @twitter.get(:StatusRelationships, key)) assert_equal({}, @twitter.get(:StatusRelationships, 'bogus')) end def test_get_super_sub_keys_with_count @twitter.insert(:StatusRelationships, key, {'user_timelines' => {@uuids[1] => 'v1', @uuids[2] => 'v2', @uuids[3] => 'v3'}}) assert_equal({@uuids[1] => 'v1'}, @twitter.get(:StatusRelationships, key, "user_timelines", :count => 1)) assert_equal({@uuids[3] => 'v3'}, @twitter.get(:StatusRelationships, key, "user_timelines", :count => 1, :reversed => true)) end def test_get_super_sub_keys_with_ranges @twitter.insert(:StatusRelationships, key, {'user_timelines' => { @uuids[1] => 'v1', @uuids[2] => 'v2', @uuids[3] => 'v3', @uuids[4] => 'v4', @uuids[5] => 'v5'}}) keys = @twitter.get(:StatusRelationships, key, "user_timelines").keys assert_equal keys.sort, keys assert_equal({@uuids[1] => 'v1'}, @twitter.get(:StatusRelationships, key, "user_timelines", :finish => @uuids[2], :count => 1)) assert_equal({@uuids[2] => 'v2'}, @twitter.get(:StatusRelationships, key, "user_timelines", :start => @uuids[2], :count => 1)) assert_equal 4, @twitter.get(:StatusRelationships, key, "user_timelines", :start => @uuids[2], :finish => @uuids[5]).size end def test_get_super_sub_key columns = {@uuids[1] => 'v1', @uuids[2] => 'v2'} @twitter.insert(:StatusRelationships, key, {'user_timelines' => columns}) assert_equal(columns, @twitter.get(:StatusRelationships, key, 'user_timelines')) assert_equal({}, @twitter.get(:StatusRelationships, 'bogus', 'user_timelines')) end def test_get_super_value columns = {@uuids[1] => 'v1'} @twitter.insert(:StatusRelationships, key, {'user_timelines' => columns}) assert_equal('v1', @twitter.get(:StatusRelationships, key, 'user_timelines', columns.keys.first)) assert_nil @twitter.get(:StatusRelationships, 'bogus', 'user_timelines', columns.keys.first) end def test_get_range @twitter.insert(:Statuses, '2', {'body' => '1'}) @twitter.insert(:Statuses, '3', {'body' => '1'}) @twitter.insert(:Statuses, '4', {'body' => '1'}) @twitter.insert(:Statuses, '5', {'body' => '1'}) @twitter.insert(:Statuses, '6', {'body' => '1'}) assert_equal(['3', '4', '5'], @twitter.get_range(:Statuses, :start => '3', :finish => '5')) end def test_multi_get @twitter.insert(:Users, key + '1', {'body' => 'v1', 'user' => 'v1'}) @twitter.insert(:Users, key + '2', {'body' => 'v2', 'user' => 'v2'}) assert_equal( OrderedHash[key + '1', {'body' => 'v1', 'user' => 'v1'}, key + '2', {'body' => 'v2', 'user' => 'v2'}, 'bogus', {}], @twitter.multi_get(:Users, [key + '1', key + '2', 'bogus'])) assert_equal( OrderedHash[key + '2', {'body' => 'v2', 'user' => 'v2'}, 'bogus', {}, key + '1', {'body' => 'v1', 'user' => 'v1'}], @twitter.multi_get(:Users, [key + '2', 'bogus', key + '1'])) end def test_remove_key @twitter.insert(:Statuses, key, {'body' => 'v'}) assert_equal({'body' => 'v'}, @twitter.get(:Statuses, key)) @twitter.remove(:Statuses, key) assert_equal({}, @twitter.get(:Statuses, key)) assert_equal 0, @twitter.count_range(:Statuses) end def test_remove_value @twitter.insert(:Statuses, key, {'body' => 'v'}) @twitter.remove(:Statuses, key, 'body') assert_nil @twitter.get(:Statuses, key, 'body') end def test_remove_super_key @twitter.insert(:StatusRelationships, key, {'user_timelines' => {@uuids[1] => 'v1'}}) @twitter.remove(:StatusRelationships, key) assert_equal({}, @twitter.get(:StatusRelationships, key)) end def test_remove_super_sub_key @twitter.insert(:StatusRelationships, key, {'user_timelines' => {@uuids[1] => 'v1'}}) @twitter.remove(:StatusRelationships, key, 'user_timelines') assert_equal({}, @twitter.get(:StatusRelationships, key, 'user_timelines')) end def test_remove_super_value columns = {@uuids[1] => 'v1'} @twitter.insert(:StatusRelationships, key, {'user_timelines' => columns}) @twitter.remove(:StatusRelationships, key, 'user_timelines', columns.keys.first) assert_nil @twitter.get(:StatusRelationships, key, 'user_timelines', columns.keys.first) end def test_clear_column_family @twitter.insert(:Statuses, key + "1", {'body' => '1'}) @twitter.insert(:Statuses, key + "2", {'body' => '2'}) @twitter.insert(:Statuses, key + "3", {'body' => '3'}) @twitter.clear_column_family!(:Statuses) assert_equal 0, @twitter.count_range(:Statuses) end def test_insert_key @twitter.insert(:Statuses, key, {'body' => 'v', 'user' => 'v'}) assert_equal({'body' => 'v', 'user' => 'v'}, @twitter.get(:Statuses, key)) end def test_insert_super_key columns = {@uuids[1] => 'v1', @uuids[2] => 'v2'} @twitter.insert(:StatusRelationships, key, {'user_timelines' => columns}) assert_equal(columns, @twitter.get(:StatusRelationships, key, 'user_timelines')) end def test_get_columns @twitter.insert(:Statuses, key, {'body' => 'v1', 'user' => 'v2'}) assert_equal(['v1' , 'v2'], @twitter.get_columns(:Statuses, key, ['body', 'user'])) end def test_get_column_values_super user_columns, mentions_columns = {@uuids[1] => 'v1'}, {@uuids[2] => 'v2'} @twitter.insert(:StatusRelationships, key, {'user_timelines' => user_columns, 'mentions_timelines' => mentions_columns}) assert_equal [user_columns, mentions_columns], @twitter.get_columns(:StatusRelationships, key, ['user_timelines', 'mentions_timelines']) end def test_multi_get_columns @twitter.insert(:Users, key + '1', {'body' => 'v1', 'user' => 'v1'}) @twitter.insert(:Users, key + '2', {'body' => 'v2', 'user' => 'v2'}) assert_equal( OrderedHash[key + '1', ['v1', 'v1'], key + '2', ['v2', 'v2'], 'bogus', [nil, nil]], @twitter.multi_get_columns(:Users, [key + '1', key + '2', 'bogus'], ['body', 'user'])) assert_equal( OrderedHash[key + '2', ['v2', 'v2'], 'bogus', [nil, nil], key + '1', ['v1', 'v1']], @twitter.multi_get_columns(:Users, [key + '2', 'bogus', key + '1'], ['body', 'user'])) end # Not supported # def test_get_columns_super_sub # @twitter.insert(:StatusRelationships, key, { # 'user_timelines' => {@uuids[1] => 'v1'}, # 'mentions_timelines' => {@uuids[2] => 'v2'}}) # assert_equal ['v1', 'v2'], # @twitter.get_columns(:StatusRelationships, key, 'user_timelines', ['1', key]) # end def test_count_keys @twitter.insert(:Statuses, key + "1", {'body' => '1'}) @twitter.insert(:Statuses, key + "2", {'body' => '2'}) @twitter.insert(:Statuses, key + "3", {'body' => '3'}) assert_equal 3, @twitter.count_range(:Statuses) end def test_count_columns @twitter.insert(:Statuses, key, {'body' => 'v1', 'user' => 'v2'}) assert_equal 2, @twitter.count_columns(:Statuses, key) end def test_count_super_columns @twitter.insert(:StatusRelationships, key, { 'user_timelines' => {@uuids[1] => 'v1'}, 'mentions_timelines' => {@uuids[2] => 'v2'}}) assert_equal 2, @twitter.count_columns(:StatusRelationships, key) end def test_count_super_sub_columns @twitter.insert(:StatusRelationships, key, {'user_timelines' => {@uuids[1] => 'v1', @uuids[2] => 'v2'}}) assert_equal 2, @twitter.count_columns(:StatusRelationships, key, 'user_timelines') end def test_multi_count_columns @twitter.insert(:Users, key + '1', {'body' => 'v1', 'user' => 'v1'}) @twitter.insert(:Users, key + '2', {'body' => 'v2', 'user' => 'v2'}) assert_equal( OrderedHash[key + '1', 2, key + '2', 2, 'bogus', 0], @twitter.multi_count_columns(:Users, [key + '1', key + '2', 'bogus'])) assert_equal( OrderedHash[key + '2', 2, 'bogus', 0, key + '1', 2], @twitter.multi_count_columns(:Users, [key + '2', 'bogus', key + '1'])) end def test_batch_insert @twitter.insert(:Users, key + '1', {'body' => 'v1', 'user' => 'v1'}) @twitter.batch do @twitter.insert(:Users, key + '2', {'body' => 'v2', 'user' => 'v2'}) @twitter.insert(:Users, key + '3', {'body' => 'bogus', 'user' => 'v3'}) @twitter.insert(:Users, key + '3', {'body' => 'v3', 'location' => 'v3'}) @twitter.insert(:Statuses, key + '3', {'body' => 'v'}) assert_equal({'body' => 'v1', 'user' => 'v1'}, @twitter.get(:Users, key + '1')) # Written assert_equal({}, @twitter.get(:Users, key + '2')) # Not yet written assert_equal({}, @twitter.get(:Statuses, key + '3')) # Not yet written @twitter.remove(:Users, key + '1') assert_equal({'body' => 'v1', 'user' => 'v1'}, @twitter.get(:Users, key + '1')) # Not yet removed @twitter.remove(:Users, key + '4') @twitter.insert(:Users, key + '4', {'body' => 'v4', 'user' => 'v4'}) assert_equal({}, @twitter.get(:Users, key + '4')) # Not yet written end assert_equal({'body' => 'v2', 'user' => 'v2'}, @twitter.get(:Users, key + '2')) # Written assert_equal({'body' => 'v3', 'user' => 'v3', 'location' => 'v3'}, @twitter.get(:Users, key + '3')) # Written and compacted assert_equal({'body' => 'v4', 'user' => 'v4'}, @twitter.get(:Users, key + '4')) # Written assert_equal({'body' => 'v'}, @twitter.get(:Statuses, key + '3')) # Written assert_equal({}, @twitter.get(:Users, key + '1')) # Removed end private def key caller.first[/`(.*?)'/, 1] end end