momomoto 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (65) hide show
  1. data/LICENSE +340 -0
  2. data/Rakefile +38 -0
  3. data/lib/momomoto.rb +5 -0
  4. data/lib/momomoto/base.rb +162 -0
  5. data/lib/momomoto/database.rb +179 -0
  6. data/lib/momomoto/datatype.rb +20 -0
  7. data/lib/momomoto/datatype/base.rb +78 -0
  8. data/lib/momomoto/datatype/bigint.rb +9 -0
  9. data/lib/momomoto/datatype/boolean.rb +23 -0
  10. data/lib/momomoto/datatype/bytea.rb +13 -0
  11. data/lib/momomoto/datatype/character.rb +7 -0
  12. data/lib/momomoto/datatype/character_varying.rb +7 -0
  13. data/lib/momomoto/datatype/date.rb +22 -0
  14. data/lib/momomoto/datatype/inet.rb +14 -0
  15. data/lib/momomoto/datatype/integer.rb +16 -0
  16. data/lib/momomoto/datatype/interval.rb +30 -0
  17. data/lib/momomoto/datatype/numeric.rb +17 -0
  18. data/lib/momomoto/datatype/real.rb +7 -0
  19. data/lib/momomoto/datatype/smallint.rb +7 -0
  20. data/lib/momomoto/datatype/text.rb +24 -0
  21. data/lib/momomoto/datatype/time_with_time_zone.rb +10 -0
  22. data/lib/momomoto/datatype/time_without_time_zone.rb +30 -0
  23. data/lib/momomoto/datatype/timestamp_with_time_zone.rb +7 -0
  24. data/lib/momomoto/datatype/timestamp_without_time_zone.rb +29 -0
  25. data/lib/momomoto/information_schema/columns.rb +45 -0
  26. data/lib/momomoto/information_schema/fetch_procedure_columns.rb +14 -0
  27. data/lib/momomoto/information_schema/fetch_procedure_parameters.rb +14 -0
  28. data/lib/momomoto/information_schema/key_column_usage.rb +19 -0
  29. data/lib/momomoto/information_schema/routines.rb +12 -0
  30. data/lib/momomoto/information_schema/table_constraints.rb +19 -0
  31. data/lib/momomoto/join.rb +66 -0
  32. data/lib/momomoto/momomoto.rb +10 -0
  33. data/lib/momomoto/order.rb +56 -0
  34. data/lib/momomoto/procedure.rb +129 -0
  35. data/lib/momomoto/row.rb +63 -0
  36. data/lib/momomoto/table.rb +251 -0
  37. data/sql/install.sql +10 -0
  38. data/sql/procedures.sql +54 -0
  39. data/sql/types.sql +11 -0
  40. data/test/test_base.rb +17 -0
  41. data/test/test_bigint.rb +26 -0
  42. data/test/test_boolean.rb +30 -0
  43. data/test/test_bytea.rb +35 -0
  44. data/test/test_character.rb +27 -0
  45. data/test/test_character_varying.rb +17 -0
  46. data/test/test_database.rb +63 -0
  47. data/test/test_datatype.rb +62 -0
  48. data/test/test_date.rb +50 -0
  49. data/test/test_inet.rb +27 -0
  50. data/test/test_information_schema.rb +27 -0
  51. data/test/test_integer.rb +37 -0
  52. data/test/test_interval.rb +38 -0
  53. data/test/test_join.rb +19 -0
  54. data/test/test_numeric.rb +30 -0
  55. data/test/test_procedure.rb +75 -0
  56. data/test/test_real.rb +17 -0
  57. data/test/test_row.rb +47 -0
  58. data/test/test_smallint.rb +26 -0
  59. data/test/test_table.rb +233 -0
  60. data/test/test_text.rb +25 -0
  61. data/test/test_time_with_time_zone.rb +17 -0
  62. data/test/test_time_without_time_zone.rb +40 -0
  63. data/test/test_timestamp_with_time_zone.rb +17 -0
  64. data/test/test_timestamp_without_time_zone.rb +28 -0
  65. metadata +116 -0
@@ -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
+