ackbar 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG +39 -0
- data/README +88 -0
- data/Rakefile +75 -0
- data/TODO +14 -0
- data/kirbybase_adapter.rb +1275 -0
- data/test/001_schema_migration_test.rb +32 -0
- data/test/ar_base_tests_runner.rb +415 -0
- data/test/ar_model_adaptation.rb +98 -0
- data/test/connection.rb +27 -0
- data/test/create_dbs_for_ar_tests.rb +171 -0
- data/test/fixtures/authors.yml +6 -0
- data/test/fixtures/authors_books.yml +8 -0
- data/test/fixtures/books.yml +4 -0
- data/test/fixtures/pages.yml +98 -0
- data/test/fixtures/publishers.yml +7 -0
- data/test/kb_associations_test.rb +107 -0
- data/test/kb_basics_test.rb +204 -0
- data/test/kb_schema_test.rb +169 -0
- data/test/kb_sql_to_code_test.rb +79 -0
- data/test/kb_stdlib_extensions_test.rb +38 -0
- data/test/model.rb +27 -0
- data/test/schema.rb +41 -0
- data/test/test_helper.rb +49 -0
- metadata +89 -0
data/test/connection.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
print "Using native KirbyBase\n"
|
2
|
+
require_dependency 'fixtures/course'
|
3
|
+
require 'logger'
|
4
|
+
require 'create_dbs_for_ar_tests'
|
5
|
+
|
6
|
+
db1_path = File.expand_path File.join(File.dirname(__FILE__), 'db/activerecord_unittest')
|
7
|
+
db2_path = File.expand_path File.join(File.dirname(__FILE__), 'db/activerecord_unittest2')
|
8
|
+
|
9
|
+
[db1_path, db2_path].each_with_index do |path, idx|
|
10
|
+
FileUtils.rm_rf(path) rescue nil
|
11
|
+
FileUtils.mkdir(path) rescue Errno::EEXIST nil
|
12
|
+
end
|
13
|
+
|
14
|
+
db = KirbyBase.new :local, nil, nil, db1_path
|
15
|
+
create_and_init db
|
16
|
+
db2 = KirbyBase.new :local, nil, nil, db2_path
|
17
|
+
create_and_init_2 db2
|
18
|
+
|
19
|
+
ActiveRecord::Base.establish_connection(
|
20
|
+
:adapter => "kirbybase",
|
21
|
+
:database => db1_path
|
22
|
+
)
|
23
|
+
|
24
|
+
Course.establish_connection(
|
25
|
+
:adapter => "kirbybase",
|
26
|
+
:database => db2_path
|
27
|
+
)
|
@@ -0,0 +1,171 @@
|
|
1
|
+
require 'kirbybase'
|
2
|
+
|
3
|
+
def create_and_init db
|
4
|
+
db.create_table(:accounts,
|
5
|
+
:firm_id, { :DataType => :Integer, :Default => nil },
|
6
|
+
:credit_limit, { :DataType => :Integer, :Default => nil }
|
7
|
+
)
|
8
|
+
|
9
|
+
db.create_table(:companies,
|
10
|
+
:type, { :DataType => :String, :Default => nil },
|
11
|
+
:ruby_type, { :DataType => :String, :Default => nil },
|
12
|
+
:firm_id, { :DataType => :Integer, :Default => nil },
|
13
|
+
:name, { :DataType => :String, :Default => nil },
|
14
|
+
:client_of, { :DataType => :Integer, :Default => nil },
|
15
|
+
:rating, { :DataType => :Integer, :Default => 1 }
|
16
|
+
)
|
17
|
+
|
18
|
+
|
19
|
+
db.create_table(:topics,
|
20
|
+
:title, { :DataType => :String, :Default => nil },
|
21
|
+
:author_name, { :DataType => :String, :Default => nil },
|
22
|
+
:author_email_address, { :DataType => :String, :Default => nil },
|
23
|
+
:written_on, { :DataType => :Time, :Default => nil },
|
24
|
+
:bonus_time, { :DataType => :Time, :Default => nil },
|
25
|
+
:last_read, { :DataType => :Date, :Default => nil },
|
26
|
+
:content, { :DataType => :String },
|
27
|
+
:approved, { :DataType => :Boolean, :Default => true },
|
28
|
+
:replies_count, { :DataType => :Integer, :Default => 0 },
|
29
|
+
:parent_id, { :DataType => :Integer, :Default => nil },
|
30
|
+
:type, { :DataType => :String, :Default => nil }
|
31
|
+
)
|
32
|
+
|
33
|
+
db.create_table(:developers,
|
34
|
+
:name, { :DataType => :String, :Default => nil },
|
35
|
+
:salary, { :DataType => :Integer, :Default => 70000 },
|
36
|
+
:created_at, { :DataType => :Time, :Default => nil },
|
37
|
+
:updated_at, { :DataType => :Time, :Default => nil }
|
38
|
+
)
|
39
|
+
|
40
|
+
db.create_table(:projects,
|
41
|
+
:name, { :DataType => :String, :Default => nil },
|
42
|
+
:type, { :DataType => :String, :Default => nil }
|
43
|
+
)
|
44
|
+
|
45
|
+
db.create_table(:developers_projects,
|
46
|
+
:developer_id, { :DataType => :Integer, :Required => true },
|
47
|
+
:project_id, { :DataType => :Integer, :Required => true },
|
48
|
+
:joined_on, { :DataType => :Date, :Default => nil },
|
49
|
+
:access_level, { :DataType => :Integer, :Default => 1 }
|
50
|
+
)
|
51
|
+
|
52
|
+
|
53
|
+
db.create_table(:orders,
|
54
|
+
:name, { :DataType => :String, :Default => nil },
|
55
|
+
:billing_customer_id, { :DataType => :Integer, :Default => nil },
|
56
|
+
:shipping_customer_id, { :DataType => :Integer, :Default => nil }
|
57
|
+
)
|
58
|
+
|
59
|
+
db.create_table(:customers,
|
60
|
+
:name, { :DataType => :String, :Default => nil },
|
61
|
+
:balance, { :DataType => :Integer, :Default => 0 },
|
62
|
+
:address_street, { :DataType => :String, :Default => nil },
|
63
|
+
:address_city, { :DataType => :String, :Default => nil },
|
64
|
+
:address_country, { :DataType => :String, :Default => nil },
|
65
|
+
:gps_location, { :DataType => :String, :Default => nil }
|
66
|
+
)
|
67
|
+
|
68
|
+
db.create_table(:movies,
|
69
|
+
:movieid, { :DataType => :Integer, :Required => true },
|
70
|
+
:name, { :DataType => :String, :Default => nil }
|
71
|
+
)
|
72
|
+
|
73
|
+
db.create_table(:subscribers,
|
74
|
+
:nick, { :DataType => :String, :Required => true },
|
75
|
+
:name, { :DataType => :String, :Default => nil }
|
76
|
+
)
|
77
|
+
|
78
|
+
db.create_table(:booleantests,
|
79
|
+
:value, { :DataType => :Boolean, :Default => nil }
|
80
|
+
)
|
81
|
+
|
82
|
+
db.create_table(:auto_id_tests,
|
83
|
+
:auto_id, { :DataType => :Integer, :Calculated => "recno" }, # emulate the primary key in the adapter
|
84
|
+
:value, { :DataType => :Integer, :Default => nil }
|
85
|
+
)
|
86
|
+
|
87
|
+
db.create_table(:entrants,
|
88
|
+
:name, { :DataType => :String, :Required => true },
|
89
|
+
:course_id, { :DataType => :Integer, :Required => true }
|
90
|
+
)
|
91
|
+
|
92
|
+
db.create_table(:colnametests,
|
93
|
+
:references, { :DataType => :Integer, :Required => true }
|
94
|
+
)
|
95
|
+
|
96
|
+
db.create_table(:mixins,
|
97
|
+
:parent_id, { :DataType => :Integer, :Default => nil },
|
98
|
+
:type, { :DataType => :String, :Default => nil },
|
99
|
+
:pos, { :DataType => :Integer, :Default => nil },
|
100
|
+
:lft, { :DataType => :Integer, :Default => nil },
|
101
|
+
:rgt, { :DataType => :Integer, :Default => nil },
|
102
|
+
:root_id, { :DataType => :Integer, :Default => nil },
|
103
|
+
:created_at, { :DataType => :Time, :Default => nil },
|
104
|
+
:updated_at, { :DataType => :Time, :Default => nil }
|
105
|
+
)
|
106
|
+
|
107
|
+
db.create_table(:people,
|
108
|
+
:first_name, { :DataType => :String, :Default => nil },
|
109
|
+
:lock_version, { :DataType => :Integer, :Required => true, :Default => 0 }
|
110
|
+
)
|
111
|
+
|
112
|
+
db.create_table(:binaries,
|
113
|
+
:data, { :DataType => :String }
|
114
|
+
)
|
115
|
+
|
116
|
+
db.create_table(:computers,
|
117
|
+
:developer, { :DataType => :Integer, :Required => true },
|
118
|
+
:extendedWarranty, { :DataType => :Integer, :Required => true }
|
119
|
+
)
|
120
|
+
|
121
|
+
db.create_table(:posts,
|
122
|
+
:author_id, { :DataType => :Integer },
|
123
|
+
:title, { :DataType => :String, :Required => true },
|
124
|
+
:type, { :DataType => :String, :Required => true },
|
125
|
+
:body, { :DataType => :String, :Required => true }
|
126
|
+
)
|
127
|
+
|
128
|
+
db.create_table(:comments,
|
129
|
+
:post_id, { :DataType => :Integer, :Required => true },
|
130
|
+
:type, { :DataType => :String, :Required => true },
|
131
|
+
:body, { :DataType => :String, :Required => true }
|
132
|
+
)
|
133
|
+
|
134
|
+
db.create_table(:authors,
|
135
|
+
:name, { :DataType => :String, :Required => true }
|
136
|
+
)
|
137
|
+
|
138
|
+
db.create_table(:tasks,
|
139
|
+
:starting, { :DataType => :Time, :Default => nil },
|
140
|
+
:ending, { :DataType => :Time, :Default => nil }
|
141
|
+
)
|
142
|
+
|
143
|
+
db.create_table(:categories,
|
144
|
+
:name, { :DataType => :String, :Required => true },
|
145
|
+
:type, { :DataType => :String, :Default => nil }
|
146
|
+
)
|
147
|
+
|
148
|
+
db.create_table(:categories_posts,
|
149
|
+
:category_id, { :DataType => :Integer, :Required => true },
|
150
|
+
:post_id, { :DataType => :Integer, :Required => true }
|
151
|
+
)
|
152
|
+
|
153
|
+
db.create_table(:fk_test_has_pk
|
154
|
+
)
|
155
|
+
|
156
|
+
db.create_table(:fk_test_has_fk,
|
157
|
+
:fk_id, { :DataType => :Integer, :Required => true }
|
158
|
+
# FOREIGN KEY ('fk_id') REFERENCES 'fk_test_has_pk'('id')
|
159
|
+
)
|
160
|
+
|
161
|
+
db.create_table(:keyboards,
|
162
|
+
:key_number, { :DataType => :Integer, :Calculated => "recno" },
|
163
|
+
:name, { :DataType => :String, :Default => nil }
|
164
|
+
)
|
165
|
+
end
|
166
|
+
|
167
|
+
def create_and_init_2 db2
|
168
|
+
db2.create_table(:courses,
|
169
|
+
:name, { :DataType => :String, :Required => true }
|
170
|
+
)
|
171
|
+
end
|
@@ -0,0 +1,98 @@
|
|
1
|
+
front:
|
2
|
+
content: front cover
|
3
|
+
book_id: 1
|
4
|
+
chap1:
|
5
|
+
content: chapter 1 text text text text text text text text text text text text text text text text text text
|
6
|
+
text text text text text text text text text text text text text text text text text text text text
|
7
|
+
text text text text text text text text text text text text text text text text text text text text
|
8
|
+
text text text text text text text text text text text text text text text text text text text text
|
9
|
+
text text text text text text text text text text text text text text text text text text text text
|
10
|
+
text text text text text text text text text text text text text text text text text text text text
|
11
|
+
text text text text text text text text text text text text text text text text text text text text
|
12
|
+
text text text text text text text text text text text text text text text text text text text text
|
13
|
+
text text text text text text text text text text text text text text text text text text text text
|
14
|
+
text text text text text text text text text text text text text text text text text text text text
|
15
|
+
text text text text text text text text text text text text text text text text text text text text
|
16
|
+
text text text text text text text text text text text text text text text text text text text text
|
17
|
+
text text text text text text text text text text text text text text text text text text text text
|
18
|
+
text text text text text text text text text text text text text text text text text text text text
|
19
|
+
text text text text text text text text text text text text text text text text text text text text
|
20
|
+
text text text text text text text text text text text text text text text text text text text text
|
21
|
+
text text text text text text text text text text text text text text text text text text text text
|
22
|
+
text text text text text text text text text text text text text text text text text text text text
|
23
|
+
text text text text text text text text text text text text text text text text text text text text
|
24
|
+
text text text text text text text text text text text text text text text text text text text text
|
25
|
+
text text text text text text text text text text text text text text text text text text text text
|
26
|
+
text text text text text text text text text text text text text text text text text text text text
|
27
|
+
text text text text text text text text text text text text text text text text text text text text
|
28
|
+
text text text text text text text text text text text text text text text text text text text text
|
29
|
+
text text text text text text text text text text text text text text text text text text text text
|
30
|
+
text text text text text text text text text text text text text text text text text text text text
|
31
|
+
text text text text text text text text text text text text text text text text text text text text
|
32
|
+
text text text text text text text text text text text text text text text text text text text text
|
33
|
+
text text text text text text text text text text text text text text text text text text text text
|
34
|
+
text text text text text text text text text text text text text text text text text text text text
|
35
|
+
text text text text text text text text text text text text text text text text text text text text
|
36
|
+
text text text text text text text text text text text text text text text text text text text text
|
37
|
+
text text text text text text text text text text text text text text text text text text text text
|
38
|
+
text text text text text text text text text text text text text text text text text text text text
|
39
|
+
text text text text text text text text text text text text text text text text text text text text
|
40
|
+
text text text text text text text text text text text text text text text text text text text text
|
41
|
+
text text text text text text text text text text text text text text text text text text text text
|
42
|
+
text text text text text text text text text text text text text text text text text text text text
|
43
|
+
text text text text text text text text text text text text text text text text text text text text
|
44
|
+
text text text text text text text text text text text text text text text text text text text text
|
45
|
+
text text text text text text text text text text text text text text text text text text text text
|
46
|
+
book_id: 1
|
47
|
+
chap2:
|
48
|
+
content: chapter 2 text text text text text text text text text text text text text text text text text text
|
49
|
+
text text text text text text text text text text text text text text text text text text text text
|
50
|
+
text text text text text text text text text text text text text text text text text text text text
|
51
|
+
text text text text text text text text text text text text text text text text text text text text
|
52
|
+
text text text text text text text text text text text text text text text text text text text text
|
53
|
+
text text text text text text text text text text text text text text text text text text text text
|
54
|
+
text text text text text text text text text text text text text text text text text text text text
|
55
|
+
text text text text text text text text text text text text text text text text text text text text
|
56
|
+
text text text text text text text text text text text text text text text text text text text text
|
57
|
+
text text text text text text text text text text text text text text text text text text text text
|
58
|
+
text text text text text text text text text text text text text text text text text text text text
|
59
|
+
text text text text text text text text text text text text text text text text text text text text
|
60
|
+
text text text text text text text text text text text text text text text text text text text text
|
61
|
+
text text text text text text text text text text text text text text text text text text text text
|
62
|
+
text text text text text text text text text text text text text text text text text text text text
|
63
|
+
text text text text text text text text text text text text text text text text text text text text
|
64
|
+
text text text text text text text text text text text text text text text text text text text text
|
65
|
+
text text text text text text text text text text text text text text text text text text text text
|
66
|
+
text text text text text text text text text text text text text text text text text text text text
|
67
|
+
text text text text text text text text text text text text text text text text text text text text
|
68
|
+
text text text text text text text text text text text text text text text text text text text text
|
69
|
+
text text text text text text text text text text text text text text text text text text text text
|
70
|
+
text text text text text text text text text text text text text text text text text text text text
|
71
|
+
text text text text text text text text text text text text text text text text text text text text
|
72
|
+
text text text text text text text text text text text text text text text text text text text text
|
73
|
+
text text text text text text text text text text text text text text text text text text text text
|
74
|
+
text text text text text text text text text text text text text text text text text text text text
|
75
|
+
text text text text text text text text text text text text text text text text text text text text
|
76
|
+
text text text text text text text text text text text text text text text text text text text text
|
77
|
+
text text text text text text text text text text text text text text text text text text text text
|
78
|
+
text text text text text text text text text text text text text text text text text text text text
|
79
|
+
text text text text text text text text text text text text text text text text text text text text
|
80
|
+
text text text text text text text text text text text text text text text text text text text text
|
81
|
+
text text text text text text text text text text text text text text text text text text text text
|
82
|
+
text text text text text text text text text text text text text text text text text text text text
|
83
|
+
text text text text text text text text text text text text text text text text text text text text
|
84
|
+
text text text text text text text text text text text text text text text text text text text text
|
85
|
+
text text text text text text text text text text text text text text text text text text text text
|
86
|
+
text text text text text text text text text text text text text text text text text text text text
|
87
|
+
text text text text text text text text text text text text text text text text text text text text
|
88
|
+
text text text text text text text text text text text text text text text text text text text text
|
89
|
+
text text text text text text text text text text text text text text text text text text text text
|
90
|
+
text text text text text text text text text text text text text text text text text text text text
|
91
|
+
book_id: 1
|
92
|
+
annex:
|
93
|
+
content: annex
|
94
|
+
book_id: 1
|
95
|
+
back:
|
96
|
+
content: back cover
|
97
|
+
book_id: 1
|
98
|
+
|
@@ -0,0 +1,107 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class KBAssociationsTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
self.fixture_path = File.expand_path(File.dirname(__FILE__)) + '/fixtures'
|
6
|
+
use_transactional_fixtures = false
|
7
|
+
fixtures :publishers, :authors, :books, :pages, :authors_books
|
8
|
+
|
9
|
+
def setup
|
10
|
+
# recreate_kb_database
|
11
|
+
# load_kb_fixtures
|
12
|
+
end
|
13
|
+
|
14
|
+
def tear_down
|
15
|
+
# unload_kb_fixtures
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_has_one
|
19
|
+
@err = Errata.create :book_id => 1, :contents => 'page 1: no text'
|
20
|
+
|
21
|
+
assert_equal @pickaxe, Errata.find(:first).book
|
22
|
+
assert_equal @err, Book.find(:first).errata
|
23
|
+
|
24
|
+
@cvs = Book.create :name => 'Pragmatic CVS', :published => 1.year.ago.to_date, :publisher => @pragprogs
|
25
|
+
@err = Errata.create :book => @cvs, :contents => 'use SVN'
|
26
|
+
@cvs.reload; @err.reload
|
27
|
+
assert_equal @cvs, Errata.find(:first, :conditions => lambda{|r| r.book_id == @cvs.id}).book
|
28
|
+
assert_equal @err, Book.find(:first, :conditions => lambda{|r| r.name =~ /CVS/}).errata
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_belongs_to
|
32
|
+
@cvs = Book.create :publisher_id => @pragprog.id, :name => 'Pragmatic CVS', :published => Date.today
|
33
|
+
assert_equal @pragprog, @cvs.publisher
|
34
|
+
assert_equal @pragprog.id, $db.get_table(:books).select{|b|b.name =~ /CVS/}[0].publisher_id
|
35
|
+
|
36
|
+
@svn = Book.create :publisher => @pragprog, :name => 'Pragmatic SVN', :published => Date.today
|
37
|
+
assert_equal @pragprog, @svn.publisher
|
38
|
+
assert_equal @pragprog.id, $db.get_table(:books).select{|b|b.name =~ /SVN/}[0].publisher_id
|
39
|
+
|
40
|
+
assert_equal @pragprog.id, $db.get_table(:books).select{|b| b.name =~ /ruby/i}[0].publisher_id
|
41
|
+
book = Book.find(:first) {|b| b.name =~ /ruby/i}
|
42
|
+
assert_equal @pickaxe, book
|
43
|
+
assert_equal @pragprog, book.publisher
|
44
|
+
|
45
|
+
book.publisher = nil
|
46
|
+
book.save
|
47
|
+
|
48
|
+
assert_equal nil, $db.get_table(:books).select{|b|b.name =~ /ruby/i}[0].publisher_id
|
49
|
+
assert_equal nil, book.publisher
|
50
|
+
assert_equal nil, Book.find(:first).publisher
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_has_many
|
54
|
+
assert_equal 5, Book.find(:first).pages.size
|
55
|
+
assert_equal [@front, @chap1, @chap2, @annex, @back].sort_by(:id), @pickaxe.pages.sort_by(:id)
|
56
|
+
|
57
|
+
assert_equal [@chap1, @chap2].sort_by(:id), @pickaxe.pages.find(:all, :conditions => lambda{|rec| rec.book_id == @pickaxe.id and rec.content =~ /text/}).sort_by(:id)
|
58
|
+
end
|
59
|
+
|
60
|
+
def test_has_many_destroy_dependents
|
61
|
+
book = Book.create :name => 'pulp fiction', :published => Date.today
|
62
|
+
page1 = Page.create :book => book, :page_num => 1, :content => 'text 1'
|
63
|
+
page2 = Page.create :book => book, :page_num => 2, :content => 'text 2'
|
64
|
+
page3 = Page.create :book => book, :page_num => 3, :content => 'text 3'
|
65
|
+
|
66
|
+
book.pages << page1
|
67
|
+
book.pages << [page2, page3]
|
68
|
+
assert_equal 2, book.id
|
69
|
+
|
70
|
+
assert_equal 2, Book.find(:all).size
|
71
|
+
assert_equal 8, Page.find(:all).size
|
72
|
+
assert_equal 5, Book.find(1).pages.size
|
73
|
+
assert_equal 3, Book.find(2).pages.size
|
74
|
+
|
75
|
+
Book.destroy(2)
|
76
|
+
assert_raise(ActiveRecord::RecordNotFound) { Book.find(2) }
|
77
|
+
assert_raise(ActiveRecord::RecordNotFound) { Page.find(page1.id) }
|
78
|
+
assert_raise(ActiveRecord::RecordNotFound) { Page.find(page2.id) }
|
79
|
+
assert_raise(ActiveRecord::RecordNotFound) { Page.find(page3.id) }
|
80
|
+
|
81
|
+
assert_equal 1, Book.find(:all).size
|
82
|
+
assert_equal 5, Page.find(:all).size
|
83
|
+
assert_equal 5, Book.find(1).pages.size
|
84
|
+
end
|
85
|
+
|
86
|
+
def test_has_and_belongs_to_many
|
87
|
+
assert_equal 2, $db.get_table(:authors_books).select.size
|
88
|
+
assert_equal [@andy, @dave], @pickaxe.author
|
89
|
+
assert_equal 2, @pickaxe.author.size
|
90
|
+
|
91
|
+
assert_equal [@pickaxe], @andy.book
|
92
|
+
assert_equal [@pickaxe], @dave.book
|
93
|
+
assert_equal 1, @andy.book.size
|
94
|
+
assert_equal 1, @dave.book.size
|
95
|
+
|
96
|
+
@cvs = Book.create :publisher_id => @pragprog.id, :name => 'Pragmatic CVS', :published => Date.today
|
97
|
+
@cvs.author << @andy
|
98
|
+
@svn = Book.create :publisher => @pragprog, :name => 'Pragmatic SVN', :published => Date.today
|
99
|
+
@svn.author << @dave
|
100
|
+
|
101
|
+
assert_equal [@andy], @cvs.author
|
102
|
+
assert_equal [@dave], @svn.author
|
103
|
+
@andy.reload; @dave.reload
|
104
|
+
assert_equal [@pickaxe, @cvs], @andy.book
|
105
|
+
assert_equal [@pickaxe, @svn], @dave.book
|
106
|
+
end
|
107
|
+
end
|
@@ -0,0 +1,204 @@
|
|
1
|
+
|
2
|
+
require 'test_helper'
|
3
|
+
|
4
|
+
class KBBasicsTest < Test::Unit::TestCase
|
5
|
+
|
6
|
+
self.fixture_path = File.expand_path(File.dirname(__FILE__)) + '/fixtures'
|
7
|
+
use_transactional_fixtures = false
|
8
|
+
fixtures :publishers, :authors, :books, :pages, :authors_books
|
9
|
+
|
10
|
+
def setup
|
11
|
+
# recreate_kb_database
|
12
|
+
# load_kb_fixtures
|
13
|
+
end
|
14
|
+
|
15
|
+
def tear_down
|
16
|
+
# unload_kb_fixtures
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_add_records
|
20
|
+
# Start with a clean slate - Fixture insert directly to DB; here we test
|
21
|
+
# insertion through AR::Base.create
|
22
|
+
recreate_kb_database
|
23
|
+
|
24
|
+
# Plain Inserts:
|
25
|
+
authors = $db.get_table :authors
|
26
|
+
assert [], authors.select
|
27
|
+
|
28
|
+
Author.create :name => 'Andy Hunt'
|
29
|
+
Author.create :name => 'Dave Thomas'
|
30
|
+
assert_equal ['Andy Hunt', 'Dave Thomas'], authors.select.map { |a| a.name }.sort
|
31
|
+
|
32
|
+
publishers = $db.get_table :publishers
|
33
|
+
assert [], publishers.select
|
34
|
+
pragprog = Publisher.create :name => "Pragmatic Programmers' Bookshelf"
|
35
|
+
assert_equal ["Pragmatic Programmers' Bookshelf"], publishers.select.map { |a| a.name }
|
36
|
+
|
37
|
+
# Inserts with a belongs_to association:
|
38
|
+
books = $db.get_table :books
|
39
|
+
assert_equal [], books.select
|
40
|
+
pickaxe = Book.create :name => 'Programming Ruby (1st Edition)', :published => Date.parse('2000-01-01'),
|
41
|
+
:publisher => pragprog
|
42
|
+
assert_equal [['Programming Ruby (1st Edition)', Date.parse('2000-01-01'), pragprog.id]],
|
43
|
+
books.select.map {|b| [b.name, b.published, b.publisher_id] }
|
44
|
+
|
45
|
+
# Inserts with a belongs_to association:
|
46
|
+
pages = $db.get_table :pages
|
47
|
+
assert_equal 0, pages.select.size
|
48
|
+
Page.create :book => pickaxe, :page_num => 0, :content => 'front cover'
|
49
|
+
Page.create :book => pickaxe, :page_num => 1, :content => 'chapter 1'*256
|
50
|
+
Page.create :book => pickaxe, :page_num => 2, :content => 'chapter 2'*512
|
51
|
+
Page.create :book => pickaxe, :page_num => 3, :content => 'chapter 3'*513
|
52
|
+
Page.create :book => pickaxe, :page_num => 4, :content => 'back cover'
|
53
|
+
assert_equal 5, pages.select.size
|
54
|
+
assert pages.select.all? { |page| page.book_id == pickaxe.id }
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_find
|
58
|
+
# test plain find :all
|
59
|
+
assert_equal [@andy, @dave], Author.find(:all)
|
60
|
+
|
61
|
+
# test plain find :first
|
62
|
+
assert_equal @andy, Author.find(:first)
|
63
|
+
|
64
|
+
# test find with block on :conditions parameter:
|
65
|
+
assert_equal [@andy].map{|a| a.name}, Author.find(:all, :conditions => lambda{ |rec| rec.name =~ /andy/i }).map{|a| a.name}
|
66
|
+
|
67
|
+
# test find with block:
|
68
|
+
assert_equal [@dave].map{|a| a.name}, Author.find(:all) { |rec| rec.name =~ /Thomas/ }.map{|a| a.name}
|
69
|
+
|
70
|
+
# test find_by_<property> methods:
|
71
|
+
assert_equal @dave.name, Author.find_by_name('Dave Thomas').name
|
72
|
+
end
|
73
|
+
|
74
|
+
def test_find_by_ids
|
75
|
+
# find by IDs
|
76
|
+
assert_equal @andy, Author.find(1)
|
77
|
+
assert_equal [@andy, @dave], Author.find(1,2)
|
78
|
+
assert_equal [@andy, @dave], Author.find([1,2])
|
79
|
+
pickaxe_id = $db.get_table(:books).select[0].recno
|
80
|
+
assert_equal @pickaxe, Book.find_by_id(pickaxe_id)
|
81
|
+
end
|
82
|
+
|
83
|
+
def test_find_with_sql_fragments
|
84
|
+
# basic SQL strings should work:
|
85
|
+
assert_equal [@andy], Author.find(:all, :conditions => "name = 'Andy Hunt'")
|
86
|
+
|
87
|
+
# guess find with basic SQL fragment:
|
88
|
+
assert_nothing_raised() { Author.find(:all, :conditions => ['name =?', 'Andy Hunt']) }
|
89
|
+
assert_equal [@andy], Author.find(:all, :conditions => ['name =?', 'Andy Hunt'])
|
90
|
+
assert_equal @dave, Author.find(:first, :conditions => ['name =?', 'Dave Thomas'])
|
91
|
+
|
92
|
+
# test more complex SQL fragments:
|
93
|
+
assert_equal [@back], Page.find(:all, :conditions => ["book_id = ? AND content = ?", 1, 'back cover'])
|
94
|
+
end
|
95
|
+
|
96
|
+
def test_update
|
97
|
+
tbl = $db.get_table(:books)
|
98
|
+
assert_equal 'Programming Ruby (1st Edition)', tbl.select.first.name
|
99
|
+
|
100
|
+
pickaxe = Book.find :first
|
101
|
+
pickaxe.name = 'Programming Ruby (2nd Edition)'
|
102
|
+
pickaxe.publisher_id = 1
|
103
|
+
pickaxe.save
|
104
|
+
|
105
|
+
assert_equal 1, tbl.select.size
|
106
|
+
assert_equal 'Programming Ruby (2nd Edition)', tbl.select.first.name
|
107
|
+
end
|
108
|
+
|
109
|
+
def test_update_all
|
110
|
+
tbl = $db.get_table(:authors)
|
111
|
+
assert_equal ['Andy Hunt', 'Dave Thomas'], tbl.select.map{|r| r.name}
|
112
|
+
|
113
|
+
Author.update_all lambda{|rec| rec.name = rec.name.upcase}
|
114
|
+
assert_equal ['ANDY HUNT', 'DAVE THOMAS'], tbl.select.map{|r| r.name}
|
115
|
+
|
116
|
+
Author.update_all lambda{|rec| rec.name = rec.name.downcase}, lambda{|rec| rec.name =~ /Andy/i}
|
117
|
+
assert_equal ['andy hunt', 'DAVE THOMAS'], tbl.select.map{|r| r.name}
|
118
|
+
|
119
|
+
Author.update_all "name = 'Andy'", lambda{|rec| rec.name =~ /Andy/i}
|
120
|
+
assert_equal ['Andy', 'DAVE THOMAS'], tbl.select.map{|r| r.name}
|
121
|
+
|
122
|
+
Author.update_all ['name = ?', 'Mr. Hunt'], lambda{|rec| rec.name =~ /Andy/i}
|
123
|
+
assert_equal ['Mr. Hunt', 'DAVE THOMAS'], tbl.select.map{|r| r.name}
|
124
|
+
|
125
|
+
Author.update_all ['name = ?', 'Dave'], ['name = ?', 'DAVE THOMAS']
|
126
|
+
assert_equal ['Mr. Hunt', 'Dave'], tbl.select.map{|r| r.name}
|
127
|
+
|
128
|
+
# We can handle simple SQL fragments in conditions
|
129
|
+
Author.update_all ['num_books = ?', 1], "name = 'Dave'"
|
130
|
+
assert_equal ['Mr. Hunt', 'Dave'], tbl.select.map{|r| r.name}
|
131
|
+
assert_equal [0, 1], tbl.select.map{|r| r.num_books}
|
132
|
+
|
133
|
+
assert_nothing_raised { Author.update_all ['name = ?', 'Dave Thomas'], "name = 'Dave' and num_books = 1" }
|
134
|
+
assert_equal ['Mr. Hunt', 'Dave Thomas'], tbl.select.map{|r| r.name}
|
135
|
+
|
136
|
+
Author.update_all ['name = ?', 'Pragmatic']
|
137
|
+
assert_equal ['Pragmatic', 'Pragmatic'], tbl.select.map{|r| r.name}
|
138
|
+
|
139
|
+
# Check updates of non-strings
|
140
|
+
tbl.drop_column :num_books rescue nil
|
141
|
+
tbl.add_column :num_books, :Integer
|
142
|
+
|
143
|
+
Author.update_all ['num_books = ?', 1]
|
144
|
+
assert_equal [1, 1], tbl.select.map{|r| r.num_books}
|
145
|
+
|
146
|
+
Author.update_all "num_books = 2"
|
147
|
+
assert_equal [2, 2], tbl.select.map{|r| r.num_books}
|
148
|
+
end
|
149
|
+
|
150
|
+
def test_destroy
|
151
|
+
authors = $db.get_table(:authors)
|
152
|
+
assert_equal 2, authors.total_recs
|
153
|
+
assert_equal 2, Author.find(:all).size
|
154
|
+
# class level destroy
|
155
|
+
Author.destroy(1)
|
156
|
+
assert_equal 1, authors.total_recs
|
157
|
+
assert_equal 1, Author.find(:all).size
|
158
|
+
# object destroy
|
159
|
+
Author.find(:first).destroy
|
160
|
+
assert_equal 0, authors.total_recs
|
161
|
+
assert_equal 0, Author.find(:all).size
|
162
|
+
assert_raise(ActiveRecord::RecordNotFound) { Author.find(1) }
|
163
|
+
|
164
|
+
pages = $db.get_table(:pages)
|
165
|
+
assert_equal 5, pages.total_recs
|
166
|
+
Page.destroy [1,2,3]
|
167
|
+
assert_equal 2, pages.total_recs
|
168
|
+
Page.destroy [4,5]
|
169
|
+
assert_equal 0, pages.total_recs
|
170
|
+
assert_raise(ActiveRecord::RecordNotFound) { Page.destroy(1) }
|
171
|
+
end
|
172
|
+
|
173
|
+
def test_increment_counter
|
174
|
+
tbl = $db.get_table(:authors)
|
175
|
+
tbl.drop_column :num_books rescue nil
|
176
|
+
tbl.add_column :num_books, { :DataType => :Integer, :Default => 0 }
|
177
|
+
tbl.update_all :num_books => 1
|
178
|
+
|
179
|
+
assert_equal [1, 1], tbl.select.map{|a| a.num_books}
|
180
|
+
assert_equal [1, 1], Author.find(:all).map{|a| a.num_books}
|
181
|
+
|
182
|
+
Author.increment_counter 'num_books', 1
|
183
|
+
assert_equal [2, 1], tbl.select.map{|r| r.num_books}
|
184
|
+
|
185
|
+
Author.increment_counter 'num_books', [1, 2]
|
186
|
+
assert_equal [3, 2], tbl.select.map{|r| r.num_books}
|
187
|
+
end
|
188
|
+
|
189
|
+
def test_decrement_counter
|
190
|
+
tbl = $db.get_table(:authors)
|
191
|
+
tbl.drop_column :num_books rescue nil
|
192
|
+
tbl.add_column :num_books, { :DataType => :Integer, :Default => 2 }
|
193
|
+
tbl.update_all :num_books => 2
|
194
|
+
|
195
|
+
assert_equal [2, 2], tbl.select.map{|a| a.num_books}
|
196
|
+
assert_equal [2, 2], Author.find(:all).map{|a| a.num_books}
|
197
|
+
|
198
|
+
Author.decrement_counter 'num_books', 1
|
199
|
+
assert_equal [1, 2], tbl.select.map{|r| r.num_books}
|
200
|
+
|
201
|
+
Author.decrement_counter 'num_books', [1, 2]
|
202
|
+
assert_equal [0, 1], tbl.select.map{|r| r.num_books}
|
203
|
+
end
|
204
|
+
end
|