@typetron/framework 0.5.0 → 0.5.3

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.
Files changed (197) hide show
  1. package/build/Database/EntityProxyHandler.js +2 -2
  2. package/build/Database/EntityProxyHandler.js.map +1 -1
  3. package/package.json +4 -7
  4. package/.eslintrc-old.js +0 -208
  5. package/Cache/Cache.ts +0 -13
  6. package/Cache/Stores/DatabaseStore.ts +0 -120
  7. package/Cache/Stores/FileStore.ts +0 -69
  8. package/Cache/Stores/MemoryStore.ts +0 -71
  9. package/Cache/index.ts +0 -5
  10. package/Cache/types.ts +0 -4
  11. package/Container/ClassResolver.ts +0 -106
  12. package/Container/Container.ts +0 -144
  13. package/Container/Contracts.ts +0 -3
  14. package/Container/Decorators.ts +0 -20
  15. package/Container/Metadata.ts +0 -16
  16. package/Container/Resolver.ts +0 -27
  17. package/Container/index.ts +0 -5
  18. package/Database/Clauses/Where.ts +0 -0
  19. package/Database/Connection.ts +0 -52
  20. package/Database/Decorators.ts +0 -142
  21. package/Database/Drivers/DatabaseDriver.ts +0 -37
  22. package/Database/Drivers/MySQL/Alter/index.ts +0 -55
  23. package/Database/Drivers/MySQL/ColumnDefinition.ts +0 -16
  24. package/Database/Drivers/MySQL/Create.ts +0 -47
  25. package/Database/Drivers/MySQL/MysqlDriver.ts +0 -123
  26. package/Database/Drivers/MySQL/Schema.ts +0 -82
  27. package/Database/Drivers/MySQL/index.ts +0 -13
  28. package/Database/Drivers/SQL/Schema.ts +0 -73
  29. package/Database/Drivers/SQL/Statements/Alter.ts +0 -22
  30. package/Database/Drivers/SQL/Statements/BaseStatement.ts +0 -55
  31. package/Database/Drivers/SQL/Statements/Delete.ts +0 -20
  32. package/Database/Drivers/SQL/Statements/Insert.ts +0 -24
  33. package/Database/Drivers/SQL/Statements/Select.ts +0 -55
  34. package/Database/Drivers/SQL/Statements/Update.ts +0 -33
  35. package/Database/Drivers/SQL/index.ts +0 -8
  36. package/Database/Drivers/SQLite/Create.ts +0 -45
  37. package/Database/Drivers/SQLite/Schema.ts +0 -54
  38. package/Database/Drivers/SQLite/SqliteDriver.ts +0 -144
  39. package/Database/Drivers/SQLite/index.ts +0 -15
  40. package/Database/Drivers/SchemaContract.ts +0 -11
  41. package/Database/Drivers/Statement.ts +0 -16
  42. package/Database/Drivers/index.ts +0 -4
  43. package/Database/Entity.ts +0 -377
  44. package/Database/EntityNotFoundError.ts +0 -5
  45. package/Database/EntityProxyHandler.ts +0 -43
  46. package/Database/EntityQuery.ts +0 -197
  47. package/Database/Expression.ts +0 -3
  48. package/Database/Fields.ts +0 -816
  49. package/Database/Helpers.ts +0 -12
  50. package/Database/List.ts +0 -71
  51. package/Database/Migrations/Migration.ts +0 -10
  52. package/Database/Migrations/MigrationHistory.ts +0 -20
  53. package/Database/Migrations/Migrator.ts +0 -122
  54. package/Database/Migrations/index.ts +0 -3
  55. package/Database/ORM/BaseRelationship.ts +0 -10
  56. package/Database/Query.ts +0 -374
  57. package/Database/Seeders/Seeder.ts +0 -3
  58. package/Database/Seeders/SeederManager.ts +0 -27
  59. package/Database/Seeders/index.ts +0 -2
  60. package/Database/StringExpression.ts +0 -9
  61. package/Database/Types.ts +0 -165
  62. package/Database/index.ts +0 -23
  63. package/Encryption/index.ts +0 -51
  64. package/Forms/Decorators.ts +0 -29
  65. package/Forms/Form.ts +0 -70
  66. package/Forms/FormFields.ts +0 -36
  67. package/Forms/index.ts +0 -3
  68. package/Framework/App.ts +0 -10
  69. package/Framework/Application.ts +0 -118
  70. package/Framework/Auth/Auth.ts +0 -122
  71. package/Framework/Auth/Authenticatable.ts +0 -9
  72. package/Framework/Auth/User.ts +0 -27
  73. package/Framework/Auth/index.ts +0 -29
  74. package/Framework/Config/AppConfig.ts +0 -25
  75. package/Framework/Config/AuthConfig.ts +0 -9
  76. package/Framework/Config/BaseConfig.ts +0 -9
  77. package/Framework/Config/CacheConfig.ts +0 -38
  78. package/Framework/Config/DatabaseConfig.ts +0 -21
  79. package/Framework/Config/MailConfig.ts +0 -30
  80. package/Framework/Config/index.ts +0 -6
  81. package/Framework/Middleware/AuthMiddleware.ts +0 -31
  82. package/Framework/Middleware/CorsMiddleware.ts +0 -32
  83. package/Framework/Middleware/StaticAssetsMiddleware.ts +0 -76
  84. package/Framework/Middleware/index.ts +0 -2
  85. package/Framework/Provider.ts +0 -9
  86. package/Framework/Providers/CacheProvider.ts +0 -28
  87. package/Framework/Providers/DatabaseProvider.ts +0 -36
  88. package/Framework/Providers/MailProvider.ts +0 -31
  89. package/Framework/Providers/WebsocketsProvider.ts +0 -120
  90. package/Framework/Resolvers/AuthResolver.ts +0 -23
  91. package/Framework/Resolvers/EntityResolver.ts +0 -41
  92. package/Framework/Resolvers/FormResolver.ts +0 -37
  93. package/Framework/RootDir.ts +0 -1
  94. package/Framework/index.ts +0 -8
  95. package/Frontend/Angular/index.ts +0 -24
  96. package/Frontend/Websockets/index.ts +0 -86
  97. package/Mail/MailAddress.ts +0 -4
  98. package/Mail/MailTransport.ts +0 -6
  99. package/Mail/Mailable.ts +0 -16
  100. package/Mail/Mailer.ts +0 -27
  101. package/Mail/PendingMail.ts +0 -68
  102. package/Mail/SentMessage.ts +0 -20
  103. package/Mail/Transports/MemoryTransport.ts +0 -13
  104. package/Mail/Transports/SendGridTransport.ts +0 -95
  105. package/Mail/index.ts +0 -3
  106. package/Models/Model.ts +0 -41
  107. package/Models/index.ts +0 -54
  108. package/Router/BaseController.ts +0 -7
  109. package/Router/Decorators.ts +0 -224
  110. package/Router/Guard.ts +0 -10
  111. package/Router/Http/Contracts.ts +0 -4
  112. package/Router/Http/ErrorHandler.ts +0 -45
  113. package/Router/Http/ErrorHandlerInterface.ts +0 -6
  114. package/Router/Http/Errors/HttpError.ts +0 -15
  115. package/Router/Http/Handler.ts +0 -183
  116. package/Router/Http/HttpRoute.ts +0 -110
  117. package/Router/Http/Middleware.ts +0 -7
  118. package/Router/Http/Request.ts +0 -225
  119. package/Router/Http/Response.ts +0 -35
  120. package/Router/Http/index.ts +0 -85
  121. package/Router/Metadata.ts +0 -34
  122. package/Router/Middleware.ts +0 -16
  123. package/Router/Request.ts +0 -65
  124. package/Router/Route.ts +0 -16
  125. package/Router/RouteNotFoundError.ts +0 -5
  126. package/Router/Router.ts +0 -35
  127. package/Router/Servers/index.ts +0 -6
  128. package/Router/Servers/node.ts +0 -49
  129. package/Router/Servers/uNetworking.ts +0 -151
  130. package/Router/Websockets/Handler.ts +0 -82
  131. package/Router/Websockets/Middleware.ts +0 -7
  132. package/Router/Websockets/Request.ts +0 -3
  133. package/Router/Websockets/WebsocketRoute.ts +0 -61
  134. package/Router/Websockets/index.ts +0 -57
  135. package/Router/Websockets/types.ts +0 -23
  136. package/Router/index.ts +0 -6
  137. package/Storage/File.ts +0 -30
  138. package/Storage/Image.ts +0 -19
  139. package/Storage/InvalidImage.ts +0 -3
  140. package/Storage/Storage.ts +0 -98
  141. package/Storage/index.ts +0 -4
  142. package/Storage/utils.ts +0 -18
  143. package/Support/Array.ts +0 -184
  144. package/Support/Math.ts +0 -12
  145. package/Support/Metadata.ts +0 -31
  146. package/Support/String.ts +0 -38
  147. package/Support/index.ts +0 -19
  148. package/Support/utils.ts +0 -7
  149. package/Testing/TestCase.ts +0 -193
  150. package/Validation/Rule.ts +0 -9
  151. package/Validation/RuleInterface.ts +0 -10
  152. package/Validation/Rules/Email.ts +0 -20
  153. package/Validation/Rules/FileExtension.ts +0 -21
  154. package/Validation/Rules/MaxLength.ts +0 -17
  155. package/Validation/Rules/MinLength.ts +0 -18
  156. package/Validation/Rules/Optional.ts +0 -18
  157. package/Validation/Rules/Required.ts +0 -29
  158. package/Validation/Validator.ts +0 -7
  159. package/Validation/index.ts +0 -12
  160. package/benchmark-index.js +0 -20
  161. package/benchmark.ts +0 -47
  162. package/tests/Cache/DatabaseStoreTest.ts +0 -110
  163. package/tests/Cache/FileStoreTest.ts +0 -93
  164. package/tests/Cache/MemoryStoreTest.ts +0 -92
  165. package/tests/Container/ContainerTest.ts +0 -336
  166. package/tests/Database/Drivers/MySQL/AlterTest.ts +0 -100
  167. package/tests/Database/Drivers/MySQL/CreateTest.ts +0 -39
  168. package/tests/Database/Drivers/MysqlDriverTest.ts +0 -140
  169. package/tests/Database/Drivers/SqliteDriverTest.ts +0 -126
  170. package/tests/Database/Entities/Article.ts +0 -21
  171. package/tests/Database/Entities/Profile.ts +0 -21
  172. package/tests/Database/Entities/Role.ts +0 -15
  173. package/tests/Database/Entities/User.ts +0 -35
  174. package/tests/Database/EntityRelationshipsTest.ts +0 -475
  175. package/tests/Database/EntityTest.ts +0 -202
  176. package/tests/Database/Migrations/RunnerTest.ts +0 -96
  177. package/tests/Database/Migrations/migrations/1.createUserTable.ts +0 -12
  178. package/tests/Database/Migrations/migrations/2.createArticlesTable.ts +0 -12
  179. package/tests/Database/QueryTest.ts +0 -573
  180. package/tests/Database/SchemaTest.ts +0 -32
  181. package/tests/Database/Seeders/RunnerTest.ts +0 -30
  182. package/tests/Database/Seeders/seeders/RandomSeeder.ts +0 -10
  183. package/tests/Database/utils.ts +0 -16
  184. package/tests/Forms/FormsTest.ts +0 -59
  185. package/tests/Framework/Middleware/StaticAssetsMiddlewareTest.ts +0 -129
  186. package/tests/Framework/Resolvers/EntityResolverTest.ts +0 -48
  187. package/tests/Framework/Router/RouterTest.ts +0 -33
  188. package/tests/Mail/MailerTest.ts +0 -76
  189. package/tests/Model/ModelTest.ts +0 -183
  190. package/tests/Router/HttpHandlerTest.ts +0 -72
  191. package/tests/Router/RequestTest.ts +0 -77
  192. package/tests/Router/WebSocketsHandlerTest.ts +0 -51
  193. package/tests/Storage/StorageTest.ts +0 -97
  194. package/tests/Support/ArrayTest.ts +0 -167
  195. package/tests/Support/StringTest.ts +0 -18
  196. package/tests/Validation/RulesTest.ts +0 -54
  197. package/types.d.ts +0 -8
@@ -1,475 +0,0 @@
1
- import { suite, test } from '@testdeck/mocha'
2
- import { Connection, Entity, EntityConstructor, Query, SqliteDriver } from '../../Database'
3
- import { User } from './Entities/User'
4
- import { Article } from './Entities/Article'
5
- import { Role } from './Entities/Role'
6
- import { Profile } from './Entities/Profile'
7
- import { expect } from 'chai'
8
- import { BelongsTo, BelongsToMany, HasMany, HasOne } from '../../Database/Fields'
9
-
10
- @suite
11
- class EntityRelationshipsTest {
12
- joe = {
13
- name: 'Joe',
14
- email: 'joe@example.com',
15
- }
16
-
17
- doe = {
18
- name: 'Doe',
19
- email: 'doe@example.com',
20
- }
21
-
22
- admin = {
23
- name: 'Admin'
24
- }
25
- developer = {
26
- name: 'Developer'
27
- }
28
-
29
- async before() {
30
- Query.connection = new Connection(new SqliteDriver(':memory:'))
31
- // Query.connection = new Connection(new MysqlDriver({
32
- // host: 'localhost', user: 'root', password: 'root', database: 'typetron_test'
33
- // }))
34
- await Query.connection.driver.schema.synchronize([User, Profile, Article, Role].pluck('metadata'))
35
- }
36
-
37
- async after() {
38
- for await (const entity of [User, Profile, Article, Role]) {
39
- await (entity as EntityConstructor<Entity>).truncate()
40
- }
41
-
42
- await Query.table('role_users').truncate()
43
- }
44
-
45
- @test
46
- async hydratesEntityWithRelationships() {
47
- const user = new User()
48
-
49
- expect(user).to.haveOwnProperty('profile')
50
- expect(user.profile).to.be.instanceOf(HasOne)
51
- expect(user).to.haveOwnProperty('articles')
52
- expect(user.articles).to.be.instanceOf(HasMany)
53
- expect(user).to.haveOwnProperty('roles')
54
- expect(user.roles).to.be.instanceOf(BelongsToMany)
55
- }
56
-
57
- @test
58
- async hasOneSave() {
59
- const user = await User.create(this.joe)
60
-
61
- const profile = new Profile().fill({
62
- address: 'address'
63
- })
64
- await user.profile.save(profile)
65
-
66
- expect(user.profile.get()?.id).to.be.equal(profile.id)
67
- expect(user.profile.get()?.user.get()?.id).to.be.equal(user.id)
68
- expect(await Profile.first()).to.be.instanceOf(Profile)
69
- }
70
-
71
- @test
72
- async hasOneLoad() {
73
- const user = await User.create(this.joe)
74
-
75
- const profile = new Profile().fill({
76
- address: 'address'
77
- })
78
- await user.profile.save(profile)
79
-
80
- const sameUser = await User.findOrFail(user.id)
81
- expect(sameUser.profile).to.be.instanceOf(HasOne)
82
- expect(sameUser.profile.get()).to.be.equal(undefined)
83
- await sameUser.load('profile')
84
-
85
- expect(sameUser.profile.get()?.id).to.be.equal(user.profile.get()?.id)
86
- expect(sameUser.profile.get()?.address).to.be.equal('address')
87
- }
88
-
89
- @test
90
- async hasOneEagerLoad() {
91
- const user = await User.create(this.joe)
92
-
93
- const profile = new Profile().fill({
94
- address: 'address'
95
- })
96
- await user.profile.save(profile)
97
-
98
- const sameUser = await User.with('profile').where('id', user.id).first() as User
99
- expect(sameUser.profile.get()).to.deep.include({
100
- id: profile.id,
101
- address: 'address'
102
- })
103
- }
104
-
105
- @test
106
- async hasManySave() {
107
- const user = await User.create(this.joe)
108
-
109
- const article = new Article().fill({
110
- title: 'title',
111
- content: 'content',
112
- })
113
- await user.articles.save(article)
114
-
115
- expect(user.articles).to.have.length(1)
116
- expect(user.articles[0]).to.deep.include({
117
- id: article.id,
118
- title: 'title',
119
- content: 'content',
120
- })
121
- }
122
-
123
- @test
124
- async hasManySaveUsingPlainObject() {
125
- const user = await User.create(this.joe)
126
-
127
- await user.articles.save({
128
- title: 'title',
129
- content: 'content',
130
- } as Article)
131
-
132
- expect(user.articles).to.have.length(1)
133
- expect(user.articles[0]).to.deep.include({
134
- title: 'title',
135
- content: 'content',
136
- })
137
- }
138
-
139
- @test
140
- async hasManySaveUsingSaveOnUnsavedParent() {
141
- const user = new User().fill(this.joe)
142
-
143
- await user.articles.save(new Article().fill({
144
- title: 'title',
145
- content: 'content',
146
- }))
147
-
148
- expect(user.articles).to.have.length(1)
149
- expect(user.articles[0]).to.deep.include({
150
- title: 'title',
151
- content: 'content',
152
- })
153
- }
154
-
155
- @test
156
- async hasManyLoad() {
157
- const user = await User.create(this.joe)
158
- await Article.create({
159
- title: 'title',
160
- content: 'content',
161
- author: user
162
- })
163
-
164
- await user.load('articles')
165
- expect(user.articles).to.be.instanceOf(HasMany)
166
- expect(user.articles[0]).to.deep.include({
167
- title: 'title',
168
- content: 'content',
169
- })
170
- }
171
-
172
- @test
173
- async hasManyGet() {
174
- const user = await User.create(this.joe)
175
- const article = new Article().fill({
176
- title: 'title',
177
- content: 'content',
178
- })
179
- await user.articles.save(article)
180
- await user.articles.load()
181
- expect(user.articles[0]).to.deep.include({
182
- title: 'title',
183
- content: 'content',
184
- })
185
- }
186
-
187
- @test
188
- async hasManyEagerLoad() {
189
- const user = new User().fill(this.joe)
190
- const article = new Article().fill({
191
- title: 'title',
192
- content: 'content',
193
- })
194
- await user.articles.save(article)
195
-
196
- const sameUser = await User.with('articles').where('id', user.id).first() as User
197
- expect(sameUser.articles).to.have.length(1)
198
- expect(user.articles[0]).to.deep.include({
199
- id: article.id,
200
- title: 'title',
201
- content: 'content',
202
- })
203
- }
204
-
205
- @test
206
- async hasManyQuery() {
207
- const user = await User.create(this.joe)
208
- await user.articles.saveMany(
209
- {
210
- title: 'title',
211
- content: 'joe\'s content',
212
- },
213
- {
214
- title: 'other title',
215
- content: 'other content',
216
- },
217
- )
218
- const doe = await User.create(this.doe)
219
- await doe.articles.save({
220
- title: 'title',
221
- content: 'doe\'s content',
222
- })
223
-
224
- const articles = await user.articles.where('title', 'title').get()
225
- expect(articles).to.have.length(1)
226
- expect(user.articles[0]).to.deep.include({
227
- title: 'title',
228
- content: 'joe\'s content',
229
- })
230
- }
231
-
232
- @test
233
- async belongsToSave() {
234
- const user = await User.create(this.joe)
235
- const article = new Article()
236
- await user.articles.save(article)
237
-
238
- expect(user.articles).to.have.length(1)
239
- expect(user.articles[0].author).to.be.instanceof(BelongsTo)
240
- }
241
-
242
- @test
243
- async belongsToEagerLoad() {
244
- const user = await User.create(this.joe)
245
- const article = new Article()
246
- await user.articles.save(article)
247
-
248
- const articles = await Article.with('author').get()
249
-
250
- expect(articles).to.have.length(1)
251
- expect(articles[0].author).to.be.instanceof(BelongsTo)
252
- }
253
-
254
- @test
255
- async belongsToEagerLoadWithCustomQuery() {
256
- const joe = await User.create(this.joe)
257
- await joe.articles.save(Article.new({title: 'article1'}))
258
- await joe.articles.save(Article.new({title: 'article2'}))
259
-
260
- const user = await User.with(['articles', query => query.where('title', 'article1')]).first() as User
261
-
262
- expect(user.articles).to.have.length(1)
263
- }
264
-
265
- // @test
266
- // async deepBelongsToEagerLoadWithCustomQuery() {
267
- // const admin = await Role.create(this.admin)
268
- //
269
- // const joe = await User.create(this.joe)
270
- // await joe.profile.save(new Profile({address: 'south address'}))
271
- // const doe = await User.create(this.doe)
272
- // await doe.profile.save(new Profile({address: 'east address'}))
273
- //
274
- // await admin.users.add(joe, doe)
275
- //
276
- // const role = await Role.with(['users.profile', query => query.whereLike('address', '%east%')]).first() as Role
277
- //
278
- // expect(role.users).to.have.length(1)
279
- // expect(role.users[0].name).to.be.equal(doe.name)
280
- // }
281
-
282
- @test
283
- async belongsToLoad() {
284
- const user = await User.create(this.joe)
285
- let article = new Article()
286
- await user.articles.save(article)
287
-
288
- article = await Article.findOrFail(article.id)
289
- const a = await Article.get()
290
- const u = await User.get()
291
- await article.load('author')
292
-
293
- expect(article.author).to.be.instanceOf(BelongsTo)
294
- expect(article.author.get()).to.be.instanceOf(User)
295
- }
296
-
297
- @test
298
- async belongsToReLoad() {
299
- const user = await User.create(this.joe)
300
- const article = new Article()
301
- await user.articles.save(article)
302
-
303
- await article.load('author')
304
-
305
- expect(article.author).to.be.instanceOf(BelongsTo)
306
- expect(article.author.get()).to.be.instanceOf(User)
307
- expect(article.author.get()?.id).to.be.equal(user.id)
308
- }
309
-
310
- @test
311
- async belongsToManySave() {
312
- const user = new User().fill(this.joe)
313
-
314
- const admin = await Role.create(this.admin)
315
- const developer = await Role.create(this.developer)
316
- await user.roles.add(admin.id, developer.id)
317
-
318
- expect(user.roles).to.have.length(2)
319
- expect(user.roles[0].id).to.be.equal(admin.id)
320
- expect(user.roles[1].id).to.be.equal(developer.id)
321
- }
322
-
323
- @test
324
- async belongsToManyEagerLoad() {
325
- const user = await User.create(this.joe)
326
-
327
- const admin = await Role.create(this.admin)
328
- const developer = await Role.create(this.developer)
329
- await user.roles.add(admin.id, developer.id)
330
-
331
- const sameUser = await User.with('roles').where('id', user.id).first() as User
332
-
333
- expect(sameUser.roles).to.have.length(2)
334
- expect(sameUser.roles[0]).to.deep.include({
335
- id: admin.id,
336
- name: admin.name
337
- })
338
- expect(sameUser.roles[1]).to.deep.include({
339
- id: developer.id,
340
- name: developer.name
341
- })
342
- }
343
-
344
- @test
345
- async belongsToManyClearing() {
346
- const user = new User().fill(this.joe)
347
- const admin = await Role.create(this.admin)
348
- const developer = await Role.create(this.developer)
349
- await user.roles.add(admin.id, developer.id)
350
-
351
- expect(user.roles).to.have.length(2)
352
- await user.roles.clear()
353
- expect(user.roles).to.have.length(0)
354
- }
355
-
356
- @test
357
- async belongsToManyRemove() {
358
- const user = new User().fill(this.joe)
359
- const admin = await Role.create(this.admin)
360
- const developer = await Role.create(this.developer)
361
- await user.roles.add(admin.id, developer.id)
362
-
363
- expect(user.roles).to.have.length(2)
364
- await user.roles.remove(admin.id)
365
- expect(user.roles).to.have.length(1)
366
- }
367
-
368
- @test
369
- async belongsToManySync() {
370
- const user = new User().fill(this.joe)
371
- const admin = await Role.create(this.admin)
372
- const developer = await Role.create(this.developer)
373
- const manager = await Role.create({name: 'Manager'})
374
- await user.roles.add(admin.id, manager.id)
375
-
376
- await user.roles.sync(admin.id, developer)
377
- expect(user.roles).to.have.length(2)
378
- expect(user.roles[0]).to.have.property('id', admin.id)
379
- expect(user.roles[1]).to.have.property('id', developer.id)
380
- }
381
-
382
- @test
383
- async belongsToManySyncWithoutDetaching() {
384
- const user = new User().fill(this.joe)
385
- const admin = await Role.create(this.admin)
386
- const developer = await Role.create(this.developer)
387
- const manager = await Role.create({name: 'manager'})
388
- await user.roles.add(admin.id, manager.id)
389
-
390
- await user.roles.syncWithoutDetaching(admin.id, developer)
391
- expect(user.roles).to.have.length(3)
392
- expect(user.roles[0]).to.have.property('id', admin.id)
393
- expect(user.roles[1]).to.have.property('id', manager.id)
394
- expect(user.roles[2]).to.have.property('id', developer.id)
395
- }
396
-
397
- @test
398
- async belongsToManyToggle() {
399
- const user = new User().fill(this.joe)
400
- const admin = await Role.create(this.admin)
401
- await user.roles.add(admin.id)
402
-
403
- expect(user.roles).to.have.length(1)
404
- expect(user.roles[0]).to.have.property('id', admin.id)
405
-
406
- const developer = await Role.create(this.developer)
407
- await user.roles.toggle(admin.id, developer.id)
408
-
409
- expect(user.roles).to.have.length(1)
410
- expect(user.roles[0]).to.have.property('id', developer.id)
411
- }
412
-
413
- @test
414
- async belongsToManyLoad() {
415
- const user = new User().fill(this.joe)
416
- const admin = await Role.create(this.admin)
417
- await user.roles.add(admin.id)
418
-
419
- const sameUser = await User.first() as User
420
- await sameUser.load('roles')
421
- expect(sameUser.roles[0]).to.deep.include(this.admin)
422
- }
423
-
424
- @test
425
- async belongsToManyQuery() {
426
- const user = new User().fill(this.joe)
427
- const admin = await Role.create(this.admin)
428
- const developer = await Role.create(this.developer)
429
- await user.roles.add(admin.id, developer.id)
430
-
431
- expect(user.roles).to.have.length(2)
432
- const roles = await user.roles.where('name', developer.name).get()
433
- expect(roles).to.have.length(1)
434
- expect(roles[0]).to.deep.include(this.developer)
435
- }
436
-
437
- @test
438
- async belongsToManyHas() {
439
- const user = new User().fill(this.joe)
440
- const admin = await Role.create(this.admin)
441
- const developer = await Role.create(this.developer)
442
- await user.roles.add(admin.id)
443
-
444
- expect(await user.roles.has(admin)).to.be.equal(true)
445
- expect(await user.roles.has(developer.id)).to.be.equal(false)
446
- }
447
-
448
- @test
449
- async nestedEagerLoading() {
450
- let user = await User.create(this.joe)
451
- await user.articles.save(new Article())
452
-
453
- user = await User.find(user.id) as User
454
- await user.load('articles.author')
455
-
456
- expect(user.articles[0].author.get()?.name).to.be.equal(user.name)
457
- }
458
-
459
- @test
460
- async multipleNestedEagerLoading() {
461
- let adminRole = await Role.create({name: 'Admin'})
462
- const joe = await User.create(this.joe)
463
- await adminRole.users.add(joe)
464
- await joe.articles.save(new Article().fill({title: 'title'}))
465
- await joe.profile.save(new Profile().fill({address: 'address'}))
466
-
467
- adminRole = await Role.find(adminRole.id) as Role
468
- await adminRole.load('users.articles.author', 'users.profile.user')
469
-
470
- expect(adminRole.users[0].articles[0].title).to.be.equal('title')
471
- expect(adminRole.users[0].profile.get()?.address).to.be.equal('address')
472
- expect(adminRole.users[0].articles[0].author.get()?.name).to.be.equal(joe.name)
473
- expect(adminRole.users[0].profile.get()?.user.get()?.name).to.be.equal(joe.name)
474
- }
475
- }
@@ -1,202 +0,0 @@
1
- import { suite, test } from '@testdeck/mocha'
2
- import { expect } from 'chai'
3
- import { Connection, Entity, EntityConstructor, Query, SqliteDriver } from '../../Database'
4
- import { User } from './Entities/User'
5
- import { EntityQuery } from '../../Database/EntityQuery'
6
- import { Article } from './Entities/Article'
7
- import { Role } from './Entities/Role'
8
-
9
- @suite
10
- class EntityTest {
11
- joe = {
12
- id: 1,
13
- name: 'Joe',
14
- email: 'joe@example.com',
15
- }
16
-
17
- doe = {
18
- id: 2,
19
- name: 'Doe',
20
- email: 'doe@example.com',
21
- }
22
-
23
- admin = {
24
- id: 1,
25
- name: 'Admin'
26
- }
27
- developer = {
28
- id: 1,
29
- name: 'Developer'
30
- }
31
-
32
- data = {
33
- users: [this.joe, this.doe],
34
- roles: [this.admin, this.developer],
35
- }
36
-
37
- async before() {
38
- Query.connection = new Connection(new SqliteDriver(':memory:'))
39
- // Query.connection = new Connection(new MysqlDriver({
40
- // host: 'localhost', user: 'root', password: 'root', database: 'typetron_test'
41
- // }))
42
- await Query.connection.driver.schema.synchronize([User, Article, Role].pluck('metadata'))
43
- }
44
-
45
- async after() {
46
- for await (const entity of [User, Article, Role]) {
47
- await (entity as EntityConstructor<Entity>).truncate()
48
- }
49
- }
50
-
51
- expectToContain(actual: User, expected: {[key: string]: string | number | Date}) {
52
- const keys = Object.keys(expected)
53
- keys.forEach(key => {
54
- expect(actual).to.have.property(key, expected[key])
55
- })
56
- }
57
-
58
- @test
59
- fillEntityWhenInstantiating() {
60
- expect(new User().fill({name: 'Joe'})).to.deep.include({name: 'Joe'})
61
- }
62
-
63
- @test
64
- getEntityTable() {
65
- expect(User.getTable()).to.equal('users')
66
- expect((new User()).getTable()).to.equal('users')
67
- }
68
-
69
- @test
70
- async createsNewQuery() {
71
- expect(User.newQuery()).to.be.an.instanceof(EntityQuery)
72
- const user = new User()
73
- expect(user.newQuery()).to.be.an.instanceof(EntityQuery)
74
- }
75
-
76
- @test
77
- async getEveryRecord() {
78
- await Query.table(User.getTable()).insert([this.joe, this.doe])
79
-
80
- const users = await User.get()
81
-
82
- expect(users).to.have.length(2)
83
-
84
- users.forEach((user, index) => this.expectToContain(user, this.data.users[index]))
85
- }
86
-
87
- // @test
88
- // async where() {
89
- // const modelMock = mock(User);
90
- // const user = instance(modelMock);
91
- //
92
- // const queryMock = mock(EntityQuery);
93
- // verify(queryMock.where('name', 'Joe')).once();
94
- // when(user.newQuery()).thenReturn(instance(queryMock));
95
- //
96
- // const users = await User.where('name', 'Joe').get();
97
- //
98
- // users.forEach((user, index) => this.expectToContain(user, this.data.users[index]));
99
- // }
100
- //
101
- // @test
102
- // async whereIn() {
103
- // when(this.connection.get(anyOfClass(Query))).thenResolve(this.data.users);
104
- //
105
- // const users = await User.whereIn('name', ['Joe', 'Doe']).get();
106
- //
107
- // users.forEach((user, index) => this.expectToContain(user, this.data.users[index]));
108
- // }
109
- //
110
- @test
111
- async save() {
112
- const data = {email: 'tester', name: 'Tester'}
113
- const user = new User().fill(data)
114
-
115
- this.expectToContain(user, data)
116
- expect(user.id).to.be.equal(undefined)
117
- await user.save()
118
- expect(user.id).to.be.equal(1)
119
- expect(user.createdAt).to.be.an.instanceOf(Date)
120
- expect(user.updatedAt).to.be.an.instanceOf(Date)
121
- }
122
-
123
- @test
124
- async insertMany() {
125
- await User.insert([this.joe, this.doe])
126
-
127
- const users = await User.get()
128
- expect(users).to.have.length(2)
129
- this.expectToContain(users[0], this.joe)
130
- this.expectToContain(users[1], this.doe)
131
- }
132
-
133
- // @test
134
- // async test0() {
135
- // const users = await User.get();
136
- // const users = await User.get('id', 'name');
137
- // const user = await User.first('id');
138
- // const user = await User.firstOrNew({name: 'John'}, {email: 'john@example.com'});
139
- // const user = await User.firstOrCreate({name: 'John'}, {email: 'john@example.com'});
140
- // const user = await User.find(1);
141
- // const users = await User.with('articles').get();
142
- // }
143
-
144
- @test
145
- async getSpecificColumns() {
146
- await Query.table(User.getTable()).insert([this.joe])
147
-
148
- const users = await User.get('id', 'name')
149
-
150
- expect(users).to.have.length(1)
151
- expect(users.first()).to.have.property('name', this.joe.name)
152
- expect(users.first()).and.to.have.property('id', this.joe.id)
153
-
154
- // TODO with the new JS updates, the Entity properties are initialized to undefined,
155
- // which means we will always get them in the object and this assert below will fail
156
- // But, the actual problem is picking what columns to select.
157
- // User.get(col1, col2) will return an User instance with col1 and col2 values but undefined for other columns
158
- // This should be invalid because there might be col3 which might be non-optional and should always have a value
159
- // expect(users.first()).and.to.not.have.property('email')
160
- }
161
-
162
- @test
163
- async getFirstRecord() {
164
- await Query.table(User.getTable()).insert([this.joe, this.doe])
165
-
166
- const user = await User.first() as User
167
-
168
- this.expectToContain(user, this.joe)
169
- }
170
-
171
- @test
172
- async getFirstRecordWithSpecificColumns() {
173
- await Query.table(User.getTable()).insert([this.joe])
174
-
175
- const user = await User.first('id') as User
176
-
177
- expect(user).to.have.property('id', this.joe.id)
178
-
179
- // TODO this has the same issue as the test `getSpecificColumns`
180
- // expect(user).to.not.have.property('name')
181
- }
182
-
183
- @test
184
- async getFirstRecordOrInstantiateOneIfNot() {
185
- const john = await User.firstOrNew({name: 'John'}, {email: 'john@example.com'})
186
-
187
- expect(john).to.have.property('name', 'John')
188
- expect(john).to.have.property('email', 'john@example.com')
189
- expect(john.id).to.be.undefined
190
- expect(await User.get()).to.have.length(0)
191
- }
192
-
193
- @test
194
- async getFirstRecordOrCreateOneIfNot() {
195
- const john = await User.firstOrCreate({name: 'John'}, {email: 'john@example.com'})
196
-
197
- expect(john).to.have.property('name', 'John')
198
- expect(john).to.have.property('email', 'john@example.com')
199
- expect(john).to.have.property('id')
200
- expect(await User.get()).to.have.length(1)
201
- }
202
- }