momomoto 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE +340 -0
- data/Rakefile +38 -0
- data/lib/momomoto.rb +5 -0
- data/lib/momomoto/base.rb +162 -0
- data/lib/momomoto/database.rb +179 -0
- data/lib/momomoto/datatype.rb +20 -0
- data/lib/momomoto/datatype/base.rb +78 -0
- data/lib/momomoto/datatype/bigint.rb +9 -0
- data/lib/momomoto/datatype/boolean.rb +23 -0
- data/lib/momomoto/datatype/bytea.rb +13 -0
- data/lib/momomoto/datatype/character.rb +7 -0
- data/lib/momomoto/datatype/character_varying.rb +7 -0
- data/lib/momomoto/datatype/date.rb +22 -0
- data/lib/momomoto/datatype/inet.rb +14 -0
- data/lib/momomoto/datatype/integer.rb +16 -0
- data/lib/momomoto/datatype/interval.rb +30 -0
- data/lib/momomoto/datatype/numeric.rb +17 -0
- data/lib/momomoto/datatype/real.rb +7 -0
- data/lib/momomoto/datatype/smallint.rb +7 -0
- data/lib/momomoto/datatype/text.rb +24 -0
- data/lib/momomoto/datatype/time_with_time_zone.rb +10 -0
- data/lib/momomoto/datatype/time_without_time_zone.rb +30 -0
- data/lib/momomoto/datatype/timestamp_with_time_zone.rb +7 -0
- data/lib/momomoto/datatype/timestamp_without_time_zone.rb +29 -0
- data/lib/momomoto/information_schema/columns.rb +45 -0
- data/lib/momomoto/information_schema/fetch_procedure_columns.rb +14 -0
- data/lib/momomoto/information_schema/fetch_procedure_parameters.rb +14 -0
- data/lib/momomoto/information_schema/key_column_usage.rb +19 -0
- data/lib/momomoto/information_schema/routines.rb +12 -0
- data/lib/momomoto/information_schema/table_constraints.rb +19 -0
- data/lib/momomoto/join.rb +66 -0
- data/lib/momomoto/momomoto.rb +10 -0
- data/lib/momomoto/order.rb +56 -0
- data/lib/momomoto/procedure.rb +129 -0
- data/lib/momomoto/row.rb +63 -0
- data/lib/momomoto/table.rb +251 -0
- data/sql/install.sql +10 -0
- data/sql/procedures.sql +54 -0
- data/sql/types.sql +11 -0
- data/test/test_base.rb +17 -0
- data/test/test_bigint.rb +26 -0
- data/test/test_boolean.rb +30 -0
- data/test/test_bytea.rb +35 -0
- data/test/test_character.rb +27 -0
- data/test/test_character_varying.rb +17 -0
- data/test/test_database.rb +63 -0
- data/test/test_datatype.rb +62 -0
- data/test/test_date.rb +50 -0
- data/test/test_inet.rb +27 -0
- data/test/test_information_schema.rb +27 -0
- data/test/test_integer.rb +37 -0
- data/test/test_interval.rb +38 -0
- data/test/test_join.rb +19 -0
- data/test/test_numeric.rb +30 -0
- data/test/test_procedure.rb +75 -0
- data/test/test_real.rb +17 -0
- data/test/test_row.rb +47 -0
- data/test/test_smallint.rb +26 -0
- data/test/test_table.rb +233 -0
- data/test/test_text.rb +25 -0
- data/test/test_time_with_time_zone.rb +17 -0
- data/test/test_time_without_time_zone.rb +40 -0
- data/test/test_timestamp_with_time_zone.rb +17 -0
- data/test/test_timestamp_without_time_zone.rb +28 -0
- metadata +116 -0
data/test/test_bytea.rb
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
|
2
|
+
class TestBytea < Test::Unit::TestCase
|
3
|
+
|
4
|
+
def test_escaping_null
|
5
|
+
c = Class.new( Momomoto::Table )
|
6
|
+
c.table_name = 'test_bytea'
|
7
|
+
data = ''
|
8
|
+
data.concat 0
|
9
|
+
data.concat "'"
|
10
|
+
r = c.new
|
11
|
+
r.data = data
|
12
|
+
r.write
|
13
|
+
r2 = c.select(:id=>r.id)
|
14
|
+
assert_equal( 1, r2.length )
|
15
|
+
assert_equal( data, r2[0].data )
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_escaping_file
|
19
|
+
c = Class.new( Momomoto::Table )
|
20
|
+
c.table_name = 'test_bytea'
|
21
|
+
r = c.new
|
22
|
+
data = File.new('test/bytea-test-file').read
|
23
|
+
r.data = data
|
24
|
+
assert_equal( data.length, r.data.length )
|
25
|
+
assert_equal( data, r.data )
|
26
|
+
r.write
|
27
|
+
r2 = c.select(:id=>r.id)
|
28
|
+
assert_equal( 1, r2.length )
|
29
|
+
assert_equal( data.length , r2[0].data.length )
|
30
|
+
assert_equal( data, r2[0].data )
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
|
@@ -0,0 +1,27 @@
|
|
1
|
+
|
2
|
+
class TestCharacter < Test::Unit::TestCase
|
3
|
+
|
4
|
+
def test_nil
|
5
|
+
c = Class.new( Momomoto::Table )
|
6
|
+
c.table_name = 'test_character'
|
7
|
+
r = c.new( :data => nil )
|
8
|
+
assert_equal( nil, r.data )
|
9
|
+
r.write
|
10
|
+
r2 = c.select( :id => r.id ).first
|
11
|
+
assert_equal( nil, r2.data )
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_samples
|
15
|
+
c = Class.new( Momomoto::Table )
|
16
|
+
c.table_name = 'test_character'
|
17
|
+
['a',"'","''","\\","a'b"].each do | value |
|
18
|
+
r = c.new( :data => value )
|
19
|
+
assert_equal( value, r.data )
|
20
|
+
r.write
|
21
|
+
r2 = c.select(:id=>r.id).first
|
22
|
+
assert_equal( value, r2.data.rstrip )
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
@@ -0,0 +1,17 @@
|
|
1
|
+
|
2
|
+
class TestCharacter_varying < Test::Unit::TestCase
|
3
|
+
|
4
|
+
def test_samples
|
5
|
+
c = Class.new( Momomoto::Table )
|
6
|
+
c.table_name = 'test_character_varying'
|
7
|
+
[nil,'a',"'","''","\\","a'b"].each do | value |
|
8
|
+
r = c.new( :data => value )
|
9
|
+
assert_equal( value, r.data )
|
10
|
+
r.write
|
11
|
+
r2 = c.select(:id=>r.id).first
|
12
|
+
assert_equal( value, r2.data )
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
|
@@ -0,0 +1,63 @@
|
|
1
|
+
|
2
|
+
class TestDatabase < Test::Unit::TestCase
|
3
|
+
|
4
|
+
def test_begin
|
5
|
+
db = Momomoto::Database.instance
|
6
|
+
assert_nothing_raised do db.begin end
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_commit
|
10
|
+
db = Momomoto::Database.instance
|
11
|
+
db.begin
|
12
|
+
assert_nothing_raised do db.commit end
|
13
|
+
assert_raise( Momomoto::Error ) do db.commit end
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_connect
|
17
|
+
db = Momomoto::Database.instance
|
18
|
+
db.disconnect
|
19
|
+
old_config = db.send( :instance_variable_get, :@config )
|
20
|
+
db.config( :port => 65535 )
|
21
|
+
assert_raise( Momomoto::CriticalError ) do
|
22
|
+
db.connect
|
23
|
+
end
|
24
|
+
db.config( old_config )
|
25
|
+
db.connect
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_execute
|
29
|
+
db = Momomoto::Database.instance
|
30
|
+
db.execute("SELECT version();")
|
31
|
+
assert_raise( Momomoto::CriticalError ) do
|
32
|
+
db.execute( "chunky bacon;")
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_fetch_primary_keys
|
37
|
+
db = Momomoto::Database.instance
|
38
|
+
pk = db.fetch_primary_keys( 'test_nodefault' )
|
39
|
+
assert_equal( 1, pk.length )
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_rollback
|
43
|
+
db = Momomoto::Database.instance
|
44
|
+
db.begin
|
45
|
+
assert_nothing_raised do db.rollback end
|
46
|
+
assert_raise( Momomoto::Error ) do db.rollback end
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_transaction
|
50
|
+
db = Momomoto::Database.instance
|
51
|
+
assert_nothing_raised do
|
52
|
+
db.transaction do end
|
53
|
+
end
|
54
|
+
assert_raise( Momomoto::CriticalError ) do
|
55
|
+
db.transaction do
|
56
|
+
db.execute( "chunky bacon;")
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
63
|
+
|
@@ -0,0 +1,62 @@
|
|
1
|
+
|
2
|
+
class TestDatatype < Test::Unit::TestCase
|
3
|
+
|
4
|
+
DATATYPES = Momomoto::Datatype.constants.map do | t |
|
5
|
+
Momomoto::Datatype.const_get( t )
|
6
|
+
end
|
7
|
+
|
8
|
+
def test_default
|
9
|
+
DATATYPES.each do | type |
|
10
|
+
row = Momomoto::Information_schema::Columns.new
|
11
|
+
row.column_default = 'default-value'
|
12
|
+
a = type.new( row )
|
13
|
+
assert_equal( 'default-value', a.default )
|
14
|
+
assert_equal( false, type.new.default )
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_not_null
|
19
|
+
DATATYPES.each do | type |
|
20
|
+
row = Momomoto::Information_schema::Columns.new
|
21
|
+
row.is_nullable = "YES"
|
22
|
+
assert_equal( false, type.new( row ).not_null? )
|
23
|
+
row.is_nullable = "NO"
|
24
|
+
assert_equal( true, type.new( row ).not_null? )
|
25
|
+
row.is_nullable = nil
|
26
|
+
assert_equal( false, type.new( row ).not_null? )
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_compile_rule
|
31
|
+
DATATYPES.each do | type |
|
32
|
+
t = type.new
|
33
|
+
tests = [ nil, [], [nil], [nil,nil], {}, {:eq=>nil}, {nil=>nil}]
|
34
|
+
tests.each do | test |
|
35
|
+
assert_raise( Momomoto::Error ) do
|
36
|
+
t.compile_rule( :field_name, test )
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_operator_sign
|
43
|
+
DATATYPES.each do | type |
|
44
|
+
assert_equal( '<=', type.operator_sign( :le ) )
|
45
|
+
assert_equal( '<', type.operator_sign( :lt ) )
|
46
|
+
assert_equal( '>=', type.operator_sign( :ge ) )
|
47
|
+
assert_equal( '>', type.operator_sign( :gt ) )
|
48
|
+
assert_equal( '=', type.operator_sign( :eq ) )
|
49
|
+
assert_equal( '<>', type.operator_sign( :ne ) )
|
50
|
+
assert_raise( Momomoto::CriticalError ) { type.operator_sign( :foo ) }
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_escape
|
55
|
+
DATATYPES.each do | type |
|
56
|
+
t = type.new
|
57
|
+
assert_equal( 'NULL', t.escape( nil ))
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
|
data/test/test_date.rb
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
|
2
|
+
class TestDate < Test::Unit::TestCase
|
3
|
+
|
4
|
+
def test_nil
|
5
|
+
c = Class.new( Momomoto::Table )
|
6
|
+
c.table_name = 'test_date'
|
7
|
+
r = c.new( :data => nil )
|
8
|
+
assert_equal( nil, r.data )
|
9
|
+
r.write
|
10
|
+
r2 = c.select( :id => r.id ).first
|
11
|
+
assert_equal( nil, r2.data )
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_samples
|
15
|
+
c = Class.new( Momomoto::Table )
|
16
|
+
c.table_name = 'test_date'
|
17
|
+
[ Date.parse("2005-5-23"), ::Date.today].each do | value |
|
18
|
+
r = c.new( :data => value )
|
19
|
+
assert_equal( value, r.data )
|
20
|
+
r.write
|
21
|
+
r2 = c.select(:id=>r.id).first
|
22
|
+
assert_equal( value, r2.data )
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_string_conversion
|
27
|
+
c = Class.new( Momomoto::Table )
|
28
|
+
c.table_name = 'test_date'
|
29
|
+
[ "2005-5-23", "2006-06-06"].each do | value |
|
30
|
+
r = c.new( :data => value )
|
31
|
+
assert_equal( Date.parse( value ), r.data )
|
32
|
+
r.write
|
33
|
+
r2 = c.select(:id=>r.id).first
|
34
|
+
assert_equal( Date.parse( value ), r2.data )
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_invalid_dates
|
39
|
+
c = Class.new( Momomoto::Table )
|
40
|
+
c.table_name = 'test_date'
|
41
|
+
[ "2005-5-43", "2006-16-06"].each do | value |
|
42
|
+
r = c.new
|
43
|
+
assert_raise( Momomoto::ConversionError ) do
|
44
|
+
r.data = value
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
|
data/test/test_inet.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
|
2
|
+
class TestInet < Test::Unit::TestCase
|
3
|
+
|
4
|
+
def test_nil
|
5
|
+
c = Class.new( Momomoto::Table )
|
6
|
+
c.table_name = 'test_inet'
|
7
|
+
r = c.new( :data => nil )
|
8
|
+
assert_equal( nil, r.data )
|
9
|
+
r.write
|
10
|
+
r2 = c.select( :id => r.id ).first
|
11
|
+
assert_equal( nil, r2.data )
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_samples
|
15
|
+
c = Class.new( Momomoto::Table )
|
16
|
+
c.table_name = 'test_inet'
|
17
|
+
[ '127.0.0.1', '172.22.64.1', '::1' ].each do | value |
|
18
|
+
r = c.new( :data => value )
|
19
|
+
assert_equal( value, r.data )
|
20
|
+
r.write
|
21
|
+
r2 = c.select(:id=>r.id).first
|
22
|
+
assert_equal( value, r2.data )
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
@@ -0,0 +1,27 @@
|
|
1
|
+
|
2
|
+
class TestInformationSchema < Test::Unit::TestCase
|
3
|
+
|
4
|
+
# test for working information_schema.columns class
|
5
|
+
def test_information_schema_columns
|
6
|
+
a = Momomoto::Information_schema::Columns.select(:table_schema => 'pg_catalog', :table_name => 'pg_tables')
|
7
|
+
assert_operator( 0, :<, a.length )
|
8
|
+
end
|
9
|
+
|
10
|
+
# test for working information_schema.key_column_usage class
|
11
|
+
def test_information_schema_key_column_usage
|
12
|
+
a = Momomoto::Information_schema::Key_column_usage.select(:table_schema => 'pg_catalog', :table_name => 'pg_class')
|
13
|
+
assert_equal( 0, a.length )
|
14
|
+
a = Momomoto::Information_schema::Key_column_usage.select(:table_schema => 'public')
|
15
|
+
assert_operator( 0, :<, a.length )
|
16
|
+
end
|
17
|
+
|
18
|
+
# test for working information_schema.table_constraints class
|
19
|
+
def test_information_schema_table_constraints
|
20
|
+
a = Momomoto::Information_schema::Table_constraints.select(:table_schema => 'pg_catalog', :table_name => 'pg_class')
|
21
|
+
assert_equal( 0, a.length )
|
22
|
+
a = Momomoto::Information_schema::Table_constraints.select(:table_schema => 'public')
|
23
|
+
assert_operator( 0, :<, a.length )
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
@@ -0,0 +1,37 @@
|
|
1
|
+
|
2
|
+
class TestInteger < Test::Unit::TestCase
|
3
|
+
|
4
|
+
def test_samples
|
5
|
+
c = Class.new( Momomoto::Table )
|
6
|
+
c.table_name = 'test_integer'
|
7
|
+
[nil,1,2,2147483647].each do | number |
|
8
|
+
r = c.new( :data => number )
|
9
|
+
assert_equal( number, r.data )
|
10
|
+
r.write
|
11
|
+
r2 = c.select(:id=>r.id).first
|
12
|
+
assert_equal( number, r2.data )
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_invalid
|
17
|
+
c = Class.new( Momomoto::Table )
|
18
|
+
c.table_name = 'test_integer'
|
19
|
+
[ "2005-5-43", "a"].each do | value |
|
20
|
+
r = c.new
|
21
|
+
assert_raise( Momomoto::ConversionError ) do
|
22
|
+
r.data = value
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_compile_rule
|
28
|
+
t = Momomoto::Datatype::Integer.new
|
29
|
+
input = [ 1, '1', [1], ['1'], [1,2,3],['1','2','3'], {:eq=>1}, {:eq=>'1'}, {:lt=>10, :gt=>5}, {:lt=>'10', :gt=>'5'} ]
|
30
|
+
|
31
|
+
input.each do | test_input |
|
32
|
+
assert_instance_of( String, t.compile_rule( :field, test_input ) )
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
|
@@ -0,0 +1,38 @@
|
|
1
|
+
|
2
|
+
class TestInterval < Test::Unit::TestCase
|
3
|
+
|
4
|
+
def test_nil
|
5
|
+
c = Class.new( Momomoto::Table )
|
6
|
+
c.table_name = 'test_interval'
|
7
|
+
r = c.new( :data => nil )
|
8
|
+
assert_equal( nil, r.data )
|
9
|
+
r.write
|
10
|
+
r2 = c.select( :id => r.id ).first
|
11
|
+
assert_equal( nil, r2.data )
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_invalid
|
15
|
+
c = Class.new( Momomoto::Table )
|
16
|
+
c.table_name = 'test_interval'
|
17
|
+
[ :x, 2.3 ].each do | value |
|
18
|
+
r = c.new
|
19
|
+
assert_raise( Momomoto::ConversionError ) do
|
20
|
+
r.data = value
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_samples
|
26
|
+
c = Class.new( Momomoto::Table )
|
27
|
+
c.table_name = 'test_interval'
|
28
|
+
[Time.parse("00:00:00"), Time.parse("01:00:00"), Time.parse("23:00:00")].each do | number |
|
29
|
+
r = c.new( :data => number )
|
30
|
+
assert_equal( number, r.data )
|
31
|
+
r.write
|
32
|
+
r2 = c.select(:id=>r.id).first
|
33
|
+
assert_equal( number, r2.data )
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
|
data/test/test_join.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
|
2
|
+
class Person < Momomoto::Table; end
|
3
|
+
class Event_Person < Momomoto::Table; end
|
4
|
+
|
5
|
+
class TestJoin < Test::Unit::TestCase
|
6
|
+
|
7
|
+
def test_initialize
|
8
|
+
a = Momomoto::Join.new( Person, {Event_Person=>:person_id})
|
9
|
+
assert_equal( true, a.respond_to?( :event_person ) )
|
10
|
+
assert_equal( true, a.respond_to?( :person ) )
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_select
|
14
|
+
a = Momomoto::Join.new( Person, {Event_Person=>:person_id})
|
15
|
+
a.select
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
|
@@ -0,0 +1,30 @@
|
|
1
|
+
|
2
|
+
class TestNumeric < Test::Unit::TestCase
|
3
|
+
|
4
|
+
def test_samples
|
5
|
+
c = Class.new( Momomoto::Table )
|
6
|
+
c.table_name = 'test_numeric'
|
7
|
+
[nil,1.0,1.5,2.0,2.3].each do | number |
|
8
|
+
number = BigDecimal.new(number.to_s)
|
9
|
+
r = c.new( :data => number )
|
10
|
+
assert_equal( number, r.data )
|
11
|
+
r.write
|
12
|
+
r2 = c.select(:id=>r.id).first
|
13
|
+
assert_equal( number, r2.data )
|
14
|
+
assert( number == r2.data )
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_invalid
|
19
|
+
c = Class.new( Momomoto::Table )
|
20
|
+
c.table_name = 'test_numeric'
|
21
|
+
[ "2005-5-43", "a"].each do | value |
|
22
|
+
r = c.new
|
23
|
+
assert_raise( Momomoto::ConversionError ) do
|
24
|
+
r.data = value
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
|