Skip to content

Commit 982bfca

Browse files
committed
Add mysql tests to ci.sh; fix mysql tests; add test to show compound PK with auto ids
1 parent 21fe7c7 commit 982bfca

File tree

7 files changed

+119
-11
lines changed

7 files changed

+119
-11
lines changed

ci.sh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,5 +31,6 @@ echo 'user root;' >> spec_openresty/s2/nginx.conf
3131

3232
./busted -o utfTerminal
3333
./busted -o utfTerminal spec_postgres/
34+
./busted -o utfTerminal spec_mysql/
3435
./busted -o utfTerminal spec_openresty/
3536
./busted -o utfTerminal spec_cqueues/

spec/core_model_specs.moon

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ assert_same_rows = (a, b) ->
1717

1818
(models) ->
1919
import it, describe, before_each, after_each from require "busted"
20-
import Users, Posts, Likes from models
20+
import Users, Posts, Images, Likes from models
2121

2222
describe "basic model", ->
2323
before_each ->
@@ -182,10 +182,11 @@ assert_same_rows = (a, b) ->
182182
before_each ->
183183
Users\create_table!
184184
Posts\create_table!
185+
Images\create_table!
185186
Likes\create_table!
186187

187188
package.loaded.models = {
188-
:Users, :Posts, :Likes
189+
:Users, :Posts, :Images, :Likes
189190
}
190191

191192
query_log = {}
@@ -272,6 +273,7 @@ assert_same_rows = (a, b) ->
272273
before_each ->
273274
Users\create_table!
274275
Posts\create_table!
276+
Images\create_table!
275277
Likes\create_table!
276278

277279
before_each ->

spec_mysql/model_spec.moon

Lines changed: 47 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
db = require "lapis.db.mysql"
22

33
import setup_db, teardown_db from require "spec_mysql.helpers"
4-
import Users, Posts, Likes from require "spec_mysql.models"
4+
import Users, Posts, Images, Likes from require "spec_mysql.models"
55

66
describe "model", ->
77
setup ->
@@ -12,7 +12,7 @@ describe "model", ->
1212

1313
describe "core model", ->
1414
build = require "spec.core_model_specs"
15-
build { :Users, :Posts, :Likes }
15+
build { :Users, :Posts, :Images, :Likes }
1616

1717
it "should get columns of model", ->
1818
Users\create_table!
@@ -39,3 +39,48 @@ describe "model", ->
3939
-- this fails in postgres, but mysql gives default values
4040
Posts\create {}
4141

42+
describe "with compound auto_increment", ->
43+
Users\create_table!
44+
Posts\create_table!
45+
Images\create_table!
46+
47+
user1 = Users\create { name: "bob" }
48+
post1 = Posts\create { user_id: user1.user_id }
49+
post2 = Posts\create { user_id: user1.user_id }
50+
51+
first = Images\create {
52+
user_id: user1.id
53+
post_id: post1.id
54+
url: "first"
55+
}
56+
second = Images\create {
57+
user_id: user1.id
58+
post_id: post1.id
59+
url: "second"
60+
}
61+
third = Images\create {
62+
user_id: user1.id
63+
post_id: post2.id
64+
url: "third"
65+
}
66+
67+
it "should increment keys", ->
68+
assert.truthy first.id < second.id
69+
assert.truthy second.id < third.id
70+
71+
it "should find entites", ->
72+
assert.same first, Images\find post1.id, first.id
73+
assert.same {first, second}, Images\find_all {post1.id}, "post_id"
74+
assert.same {third}, Images\find_all {post2.id}, "post_id"
75+
76+
it "should allow relations", ->
77+
package.loaded.models = {
78+
:Users, :Posts, :Images, :Likes
79+
}
80+
81+
assert.same user1, first\get_user!
82+
assert.same post1, first\get_post!
83+
assert.same post2, third\get_post!
84+
85+
assert.same {first.id, second.id}, [v.id for v in *post1\get_images!]
86+
assert.same {third.id}, [v.id for v in *post2\get_images!]

spec_mysql/models.moon

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,20 +16,52 @@ class Users extends Model
1616
class Posts extends Model
1717
@timestamp: true
1818

19+
@relations: {
20+
{"images", has_many: "Images"}
21+
}
22+
1923
@create_table: =>
2024
drop_tables @
2125
create_table @table_name!, {
2226
{"id", types.id}
2327
{"user_id", types.integer null: true}
24-
{"title", types.text null: false}
25-
{"body", types.text null: false}
28+
{"title", types.text null: true}
29+
{"body", types.text null: true}
2630
{"created_at", types.datetime}
2731
{"updated_at", types.datetime}
2832
}
2933

3034
@truncate: =>
3135
truncate_tables @
3236

37+
class Images extends Model
38+
@primary_key: {"user_id", "id"}
39+
@timestamp: true
40+
41+
@relations: {
42+
{"user", belongs_to: "Users"}
43+
{"post", belongs_to: "Posts"}
44+
}
45+
46+
@create_table: =>
47+
drop_tables @
48+
create_table @table_name!, {
49+
{"post_id", types.integer}
50+
-- Can't use types.id for "id" because it specifies primary_key
51+
{"id", types.integer auto_increment: true}
52+
{"user_id", types.integer null: true}
53+
{"url", types.text null: false}
54+
{"created_at", types.datetime}
55+
{"updated_at", types.datetime}
56+
57+
"PRIMARY KEY (post_id, id)"
58+
-- auto_increment must be a key of its own (PK or otherwise)
59+
"KEY id (id)"
60+
}
61+
62+
@truncate: =>
63+
truncate_tables @
64+
3365
class Likes extends Model
3466
@primary_key: {"user_id", "post_id"}
3567
@timestamp: true
@@ -44,7 +76,7 @@ class Likes extends Model
4476
create_table @table_name!, {
4577
{"user_id", types.integer}
4678
{"post_id", types.integer}
47-
{"count", types.integer}
79+
{"count", types.integer default: 0}
4880
{"created_at", types.datetime}
4981
{"updated_at", types.datetime}
5082

@@ -54,4 +86,4 @@ class Likes extends Model
5486
@truncate: =>
5587
truncate_tables @
5688

57-
{:Users, :Posts, :Likes}
89+
{:Users, :Posts, :Images, :Likes}

spec_openresty/resty_mysql_spec.moon

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ runner = NginxRunner base_path: "spec_openresty/s2/"
55
import SpecServer from require "lapis.spec.server"
66
server = SpecServer runner
77

8-
import Users, Posts, Likes from require "spec_mysql.models"
8+
import Users, Posts, Images, Likes from require "spec_mysql.models"
99

1010
import setup_db, teardown_db from require "spec_mysql.helpers"
1111

@@ -15,6 +15,7 @@ describe "resty", ->
1515

1616
Users\create_table!
1717
Posts\create_table!
18+
Images\create_table!
1819
Likes\create_table!
1920

2021
server\load_test_server!

spec_openresty/s2/app.moon

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
lapis = require "lapis"
22
db = require "lapis.db"
33

4-
import Users, Posts, Likes from require "spec_mysql.models"
4+
import Users, Posts, Images, Likes from require "spec_mysql.models"
55

66
assert = require "luassert"
77

@@ -21,6 +21,7 @@ class extends lapis.Application
2121
@before_filter ->
2222
Users\truncate!
2323
Posts\truncate!
24+
Images\truncate!
2425
Likes\truncate!
2526

2627
"/": =>

spec_postgres/model_spec.moon

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@ class Users extends Model
2222
class Posts extends Model
2323
@timestamp: true
2424

25+
@relations: {
26+
{"images", has_many: "Images"}
27+
}
28+
2529
@create_table: =>
2630
drop_tables @
2731
create_table @table_name!, {
@@ -37,6 +41,28 @@ class Posts extends Model
3741
@truncate: =>
3842
truncate_tables @
3943

44+
class Images extends Model
45+
@timestamp: true
46+
47+
@create_table: =>
48+
drop_tables @
49+
create_table @table_name!, {
50+
{"post_id", types.integer}
51+
-- TODO Can't use types.id for "id" because it specifies primary_key.
52+
-- We could pre-process the fields and collect primary keys first, then
53+
-- create a "PRIMARY KEY" string internally.
54+
{"id", types.integer auto_increment: true}
55+
{"user_id", types.integer null: true}
56+
{"url", types.text null: false}
57+
{"created_at", types.time}
58+
{"updated_at", types.time}
59+
60+
"PRIMARY KEY (post_id, id)"
61+
}
62+
63+
@truncate: =>
64+
truncate_tables @
65+
4066
class Likes extends Model
4167
@primary_key: {"user_id", "post_id"}
4268
@timestamp: true
@@ -79,7 +105,7 @@ describe "model", ->
79105

80106
describe "core model", ->
81107
build = require "spec.core_model_specs"
82-
build { :Users, :Posts, :Likes }
108+
build { :Users, :Posts, :Images, :Likes }
83109

84110
it "should get columns of model", ->
85111
Users\create_table!

0 commit comments

Comments
 (0)