@nocobase/database 0.11.1-alpha.5 → 0.12.0-alpha.2

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/lib/fields/json-field.js +5 -0
  2. package/lib/value-parsers/date-value-parser.js +10 -2
  3. package/package.json +4 -4
  4. package/src/__tests__/bigint.test.ts +0 -48
  5. package/src/__tests__/collection-importer.test.ts +0 -33
  6. package/src/__tests__/collection.sortable.test.ts +0 -65
  7. package/src/__tests__/collection.test.ts +0 -416
  8. package/src/__tests__/database.import.test.ts +0 -33
  9. package/src/__tests__/database.test.ts +0 -320
  10. package/src/__tests__/eager-loading/eager-loading-tree.test.ts +0 -542
  11. package/src/__tests__/field-options/hidden.test.ts +0 -306
  12. package/src/__tests__/field-options/inddex.test.ts +0 -43
  13. package/src/__tests__/field-options/sort-by.test.ts +0 -222
  14. package/src/__tests__/field-repository/array-field-repository.test.ts +0 -94
  15. package/src/__tests__/fields/array.test.ts +0 -66
  16. package/src/__tests__/fields/belongs-to-field.test.ts +0 -302
  17. package/src/__tests__/fields/belongs-to-many-field.test.ts +0 -106
  18. package/src/__tests__/fields/context-field.test.ts +0 -140
  19. package/src/__tests__/fields/date.test.ts +0 -73
  20. package/src/__tests__/fields/has-many-field.test.ts +0 -257
  21. package/src/__tests__/fields/has-one-field.test.ts +0 -88
  22. package/src/__tests__/fields/password-field.test.ts +0 -30
  23. package/src/__tests__/fields/set.test.ts +0 -37
  24. package/src/__tests__/fields/sort-field.test.ts +0 -256
  25. package/src/__tests__/fields/string-field.test.ts +0 -77
  26. package/src/__tests__/fields/uuid-field.test.ts +0 -30
  27. package/src/__tests__/filter-match.test.ts +0 -52
  28. package/src/__tests__/filter-parser.test.ts +0 -104
  29. package/src/__tests__/filter.test.ts +0 -155
  30. package/src/__tests__/fixtures/c0/a.ts +0 -6
  31. package/src/__tests__/fixtures/c1/b.ts +0 -6
  32. package/src/__tests__/fixtures/c2/a.ts +0 -6
  33. package/src/__tests__/fixtures/collections/delay-extend.ts +0 -6
  34. package/src/__tests__/fixtures/collections/delay-extend2.ts +0 -6
  35. package/src/__tests__/fixtures/collections/extend.ts +0 -6
  36. package/src/__tests__/fixtures/collections/extend2.ts +0 -6
  37. package/src/__tests__/fixtures/collections/posts.ts +0 -4
  38. package/src/__tests__/fixtures/collections/tags.js +0 -4
  39. package/src/__tests__/fixtures/collections/test.jpg +0 -0
  40. package/src/__tests__/fixtures/collections/user.json +0 -9
  41. package/src/__tests__/fixtures/migrations/m1.ts +0 -7
  42. package/src/__tests__/fixtures/migrations/m2.ts +0 -7
  43. package/src/__tests__/group.test.ts +0 -50
  44. package/src/__tests__/hooks/afterCreateWithAssociations.test.ts +0 -32
  45. package/src/__tests__/index.ts +0 -1
  46. package/src/__tests__/inhertits/collection-inherits-sync.test.ts +0 -38
  47. package/src/__tests__/inhertits/collection-inherits.test.ts +0 -1321
  48. package/src/__tests__/inhertits/helper.ts +0 -3
  49. package/src/__tests__/inhertits/inherited-map.test.ts +0 -27
  50. package/src/__tests__/magic-attribute-model.test.ts +0 -127
  51. package/src/__tests__/migrator.test.ts +0 -73
  52. package/src/__tests__/model-hook.test.ts +0 -54
  53. package/src/__tests__/model.changedWithAssociations.test.ts +0 -46
  54. package/src/__tests__/model.test.ts +0 -60
  55. package/src/__tests__/operator/array-operator.test.ts +0 -268
  56. package/src/__tests__/operator/association-operator.test.ts +0 -263
  57. package/src/__tests__/operator/date-operator.test.ts +0 -311
  58. package/src/__tests__/operator/empty-operator.test.ts +0 -77
  59. package/src/__tests__/operator/eq.test.ts +0 -64
  60. package/src/__tests__/operator/ne.test.ts +0 -59
  61. package/src/__tests__/operator/notIn.test.ts +0 -33
  62. package/src/__tests__/operator/string-operator.test.ts +0 -62
  63. package/src/__tests__/option-parser.test.ts +0 -243
  64. package/src/__tests__/percent2float.test.ts +0 -14
  65. package/src/__tests__/postgres/schema.test.ts +0 -120
  66. package/src/__tests__/relation-repository/appends.test.ts +0 -64
  67. package/src/__tests__/relation-repository/belongs-to-many-repository.test.ts +0 -808
  68. package/src/__tests__/relation-repository/has-many-repository.test.ts +0 -434
  69. package/src/__tests__/relation-repository/hasone-repository.test.ts +0 -145
  70. package/src/__tests__/repository/aggregation.test.ts +0 -297
  71. package/src/__tests__/repository/count.test.ts +0 -180
  72. package/src/__tests__/repository/create.test.ts +0 -286
  73. package/src/__tests__/repository/destroy.test.ts +0 -317
  74. package/src/__tests__/repository/find.test.ts +0 -612
  75. package/src/__tests__/repository/update-many.test.ts +0 -57
  76. package/src/__tests__/repository/update.test.ts +0 -95
  77. package/src/__tests__/repository.test.ts +0 -745
  78. package/src/__tests__/sequelize-hooks.test.ts +0 -64
  79. package/src/__tests__/sort.test.ts +0 -51
  80. package/src/__tests__/sql-parser.test.ts +0 -13
  81. package/src/__tests__/tree.test.ts +0 -480
  82. package/src/__tests__/underscored-options.test.ts +0 -207
  83. package/src/__tests__/update-association-values.test.ts +0 -232
  84. package/src/__tests__/update-associations-through.test.ts +0 -73
  85. package/src/__tests__/update-associations.test.ts +0 -708
  86. package/src/__tests__/update-guard.test.ts +0 -391
  87. package/src/__tests__/value-parsers/base.test.ts +0 -20
  88. package/src/__tests__/value-parsers/date.test.ts +0 -67
  89. package/src/__tests__/value-parsers/number.test.ts +0 -46
  90. package/src/__tests__/value-parsers/to-many.test.ts +0 -206
  91. package/src/__tests__/value-parsers/to-one.test.ts +0 -60
  92. package/src/__tests__/view/list-view.test.ts +0 -34
  93. package/src/__tests__/view/view-collection.test.ts +0 -456
  94. package/src/__tests__/view/view-inference.test.ts +0 -145
  95. package/src/__tests__/view/view-repository.test.ts +0 -67
  96. package/src/collection-group-manager.ts +0 -94
  97. package/src/collection-importer.ts +0 -41
  98. package/src/collection.ts +0 -688
  99. package/src/database-utils/index.ts +0 -39
  100. package/src/database.ts +0 -853
  101. package/src/decorators/must-have-filter-decorator.ts +0 -21
  102. package/src/decorators/target-collection-decorator.ts +0 -20
  103. package/src/decorators/transaction-decorator.ts +0 -58
  104. package/src/eager-loading/eager-loading-tree.ts +0 -397
  105. package/src/errors/identifier-error.ts +0 -6
  106. package/src/features/ReferencesMap.ts +0 -76
  107. package/src/features/referential-integrity-check.ts +0 -66
  108. package/src/field-repository/array-field-repository.ts +0 -155
  109. package/src/fields/array-field.ts +0 -35
  110. package/src/fields/belongs-to-field.ts +0 -125
  111. package/src/fields/belongs-to-many-field.ts +0 -154
  112. package/src/fields/boolean-field.ts +0 -12
  113. package/src/fields/context-field.ts +0 -43
  114. package/src/fields/date-field.ts +0 -30
  115. package/src/fields/field.ts +0 -255
  116. package/src/fields/has-inverse-field.ts +0 -5
  117. package/src/fields/has-many-field.ts +0 -193
  118. package/src/fields/has-one-field.ts +0 -198
  119. package/src/fields/index.ts +0 -78
  120. package/src/fields/json-field.ts +0 -26
  121. package/src/fields/number-field.ts +0 -64
  122. package/src/fields/password-field.ts +0 -74
  123. package/src/fields/radio-field.ts +0 -48
  124. package/src/fields/relation-field.ts +0 -53
  125. package/src/fields/set-field.ts +0 -25
  126. package/src/fields/sort-field.ts +0 -170
  127. package/src/fields/string-field.ts +0 -12
  128. package/src/fields/text-field.ts +0 -12
  129. package/src/fields/time-field.ts +0 -12
  130. package/src/fields/uid-field.ts +0 -42
  131. package/src/fields/uuid-field.ts +0 -21
  132. package/src/fields/virtual-field.ts +0 -12
  133. package/src/filter-match.ts +0 -49
  134. package/src/filter-parser.ts +0 -272
  135. package/src/index.ts +0 -43
  136. package/src/inherited-collection.ts +0 -113
  137. package/src/inherited-map.ts +0 -97
  138. package/src/listeners/adjacency-list.ts +0 -17
  139. package/src/listeners/append-child-collection-name-after-repository-find.ts +0 -53
  140. package/src/listeners/index.ts +0 -8
  141. package/src/magic-attribute-model.ts +0 -244
  142. package/src/migration.ts +0 -76
  143. package/src/mock-database.ts +0 -56
  144. package/src/model-hook.ts +0 -72
  145. package/src/model.ts +0 -202
  146. package/src/operators/array.ts +0 -156
  147. package/src/operators/association.ts +0 -14
  148. package/src/operators/boolean.ts +0 -18
  149. package/src/operators/child-collection.ts +0 -43
  150. package/src/operators/date.ts +0 -125
  151. package/src/operators/empty.ts +0 -75
  152. package/src/operators/eq.ts +0 -14
  153. package/src/operators/index.ts +0 -12
  154. package/src/operators/ne.ts +0 -21
  155. package/src/operators/notIn.ts +0 -13
  156. package/src/operators/string.ts +0 -40
  157. package/src/operators/utils.ts +0 -13
  158. package/src/options-parser.ts +0 -380
  159. package/src/playground.ts +0 -52
  160. package/src/query-interface/mysql-query-interface.ts +0 -79
  161. package/src/query-interface/postgres-query-interface.ts +0 -115
  162. package/src/query-interface/query-interface-builder.ts +0 -14
  163. package/src/query-interface/query-interface.ts +0 -47
  164. package/src/query-interface/sqlite-query-interface.ts +0 -89
  165. package/src/relation-repository/belongs-to-many-repository.ts +0 -260
  166. package/src/relation-repository/belongs-to-repository.ts +0 -15
  167. package/src/relation-repository/hasmany-repository.ts +0 -138
  168. package/src/relation-repository/hasone-repository.ts +0 -13
  169. package/src/relation-repository/multiple-relation-repository.ts +0 -193
  170. package/src/relation-repository/relation-repository.ts +0 -128
  171. package/src/relation-repository/single-relation-repository.ts +0 -113
  172. package/src/relation-repository/types.ts +0 -15
  173. package/src/repositories/tree-repository/adjacency-list-repository.ts +0 -157
  174. package/src/repositories/view-repository.ts +0 -3
  175. package/src/repository.ts +0 -834
  176. package/src/sql-parser/index.js +0 -10698
  177. package/src/sql-parser/postgres.js +0 -27645
  178. package/src/sql-parser/readme.md +0 -2
  179. package/src/sql-parser/sql.pegjs +0 -1297
  180. package/src/sync-runner.ts +0 -173
  181. package/src/types.ts +0 -85
  182. package/src/update-associations.ts +0 -492
  183. package/src/update-guard.ts +0 -188
  184. package/src/utils.ts +0 -109
  185. package/src/value-parsers/array-value-parser.ts +0 -30
  186. package/src/value-parsers/base-value-parser.ts +0 -40
  187. package/src/value-parsers/boolean-value-parser.ts +0 -29
  188. package/src/value-parsers/date-value-parser.ts +0 -41
  189. package/src/value-parsers/index.ts +0 -46
  190. package/src/value-parsers/json-value-parser.ts +0 -19
  191. package/src/value-parsers/number-value-parser.ts +0 -29
  192. package/src/value-parsers/string-value-parser.ts +0 -36
  193. package/src/value-parsers/to-many-value-parser.ts +0 -85
  194. package/src/value-parsers/to-one-value-parser.ts +0 -20
  195. package/src/view/field-type-map.ts +0 -58
  196. package/src/view/view-inference.ts +0 -139
  197. package/src/view-collection.ts +0 -20
@@ -14,6 +14,11 @@ function _sequelize() {
14
14
  var _field = require("./field");
15
15
  class JsonField extends _field.Field {
16
16
  get dataType() {
17
+ const dialect = this.context.database.sequelize.getDialect();
18
+ const jsonb = this.options.jsonb;
19
+ if (dialect === 'postgres' && jsonb) {
20
+ return _sequelize().DataTypes.JSONB;
21
+ }
17
22
  return _sequelize().DataTypes.JSON;
18
23
  }
19
24
  }
@@ -11,6 +11,13 @@ function _utils() {
11
11
  };
12
12
  return data;
13
13
  }
14
+ function _dayjs() {
15
+ const data = _interopRequireDefault(require("dayjs"));
16
+ _dayjs = function _dayjs() {
17
+ return data;
18
+ };
19
+ return data;
20
+ }
14
21
  function _excelDateToJs() {
15
22
  const data = require("excel-date-to-js");
16
23
  _excelDateToJs = function _excelDateToJs() {
@@ -19,6 +26,7 @@ function _excelDateToJs() {
19
26
  return data;
20
27
  }
21
28
  var _baseValueParser = require("./base-value-parser");
29
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
22
30
  function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
23
31
  function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
24
32
  function isNumeric(str) {
@@ -30,7 +38,7 @@ class DateValueParser extends _baseValueParser.BaseValueParser {
30
38
  setValue(value) {
31
39
  var _this = this;
32
40
  return _asyncToGenerator(function* () {
33
- if (_utils().dayjs.isDayjs(value)) {
41
+ if (_dayjs().default.isDayjs(value)) {
34
42
  _this.value = value;
35
43
  } else if (isDate(value)) {
36
44
  _this.value = value;
@@ -42,7 +50,7 @@ class DateValueParser extends _baseValueParser.BaseValueParser {
42
50
  }
43
51
  } else if (typeof value === 'string') {
44
52
  const props = _this.getProps();
45
- const m = (0, _utils().dayjs)(value);
53
+ const m = (0, _dayjs().default)(value);
46
54
  if (m.isValid()) {
47
55
  _this.value = (0, _utils().moment2str)(m, props);
48
56
  } else {
package/package.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "@nocobase/database",
3
- "version": "0.11.1-alpha.5",
3
+ "version": "0.12.0-alpha.2",
4
4
  "description": "",
5
5
  "main": "./lib/index.js",
6
6
  "types": "./lib/index.d.ts",
7
7
  "license": "Apache-2.0",
8
8
  "dependencies": {
9
- "@nocobase/logger": "0.11.1-alpha.5",
10
- "@nocobase/utils": "0.11.1-alpha.5",
9
+ "@nocobase/logger": "0.12.0-alpha.2",
10
+ "@nocobase/utils": "0.12.0-alpha.2",
11
11
  "async-mutex": "^0.3.2",
12
12
  "cron-parser": "4.4.0",
13
13
  "dayjs": "^1.11.8",
@@ -29,5 +29,5 @@
29
29
  "url": "git+https://github.com/nocobase/nocobase.git",
30
30
  "directory": "packages/database"
31
31
  },
32
- "gitHead": "1dcfd15a7d95a40b0a2f60e1de19ec574066fb20"
32
+ "gitHead": "a95e9e2666f0318c955113a4735bc005a2c9a767"
33
33
  }
@@ -1,48 +0,0 @@
1
- import { Database } from '../database';
2
- import { mockDatabase } from './index';
3
-
4
- const excludeSqlite = () => (process.env.DB_DIALECT != 'sqlite' ? describe : describe.skip);
5
-
6
- excludeSqlite()('collection', () => {
7
- let db: Database;
8
-
9
- beforeEach(async () => {
10
- db = mockDatabase({
11
- logging: console.log,
12
- });
13
-
14
- await db.clean({ drop: true });
15
- });
16
-
17
- afterEach(async () => {
18
- await db.close();
19
- });
20
-
21
- it('should using bigint for id field', async () => {
22
- const collection = db.collection({
23
- name: 'users',
24
- fields: [{ type: 'hasOne', name: 'profile' }],
25
- });
26
-
27
- await db.sync();
28
- const tableInfo = await db.sequelize.getQueryInterface().describeTable(collection.model.tableName);
29
-
30
- expect(tableInfo['id'].type).toBe('BIGINT');
31
-
32
- const profile = db.collection({
33
- name: 'profiles',
34
- fields: [
35
- {
36
- type: 'belongsTo',
37
- name: 'user',
38
- },
39
- ],
40
- });
41
-
42
- await db.sync();
43
-
44
- const profileTableInfo = await db.sequelize.getQueryInterface().describeTable(profile.model.tableName);
45
-
46
- expect(profileTableInfo[profile.model.rawAttributes['userId'].field].type).toBe('BIGINT');
47
- });
48
- });
@@ -1,33 +0,0 @@
1
- import { ImporterReader } from '../collection-importer';
2
- import * as path from 'path';
3
- import { extend } from '../database';
4
-
5
- describe('collection importer', () => {
6
- test('import reader', async () => {
7
- const reader = new ImporterReader(path.resolve(__dirname, './fixtures/collections'));
8
-
9
- const modules = await reader.read();
10
-
11
- const posts = modules.find((m) => m.name === 'posts');
12
-
13
- expect(posts).toMatchObject({
14
- name: 'posts',
15
- fields: [{ type: 'string', name: 'title' }],
16
- });
17
-
18
- posts.schema = 'test';
19
-
20
- const modules2 = await reader.read();
21
- const posts2 = modules2.find((m) => m.name === 'posts');
22
- expect(posts2.schema).toBeFalsy();
23
- });
24
-
25
- test('extend', async () => {
26
- const extendObject = extend({
27
- name: 'tags',
28
- fields: [{ type: 'string', name: 'title' }],
29
- });
30
-
31
- expect(extendObject).toHaveProperty('extend');
32
- });
33
- });
@@ -1,65 +0,0 @@
1
- import { mockDatabase } from './index';
2
- import { Database } from '../database';
3
-
4
- describe('collection sortable options', () => {
5
- let db: Database;
6
-
7
- beforeEach(async () => {
8
- db = mockDatabase();
9
- });
10
-
11
- afterEach(async () => {
12
- await db.close();
13
- });
14
-
15
- test('sortable=true', async () => {
16
- const Test = db.collection({
17
- name: 'test',
18
- sortable: true,
19
- });
20
-
21
- const model = Test.model;
22
-
23
- await db.sync();
24
- const instance = await model.create();
25
- expect(model.rawAttributes['sort']).toBeDefined();
26
- expect(instance.get('sort')).toBe(1);
27
- });
28
-
29
- test('sortable=string', async () => {
30
- const Test = db.collection({
31
- name: 'test',
32
- sortable: 'order',
33
- });
34
-
35
- const model = Test.model;
36
-
37
- await db.sync();
38
- const instance = await model.create();
39
- expect(model.rawAttributes['order']).toBeDefined();
40
- expect(instance.get('order')).toBe(1);
41
- });
42
-
43
- test('sortable=object', async () => {
44
- const Test = db.collection({
45
- name: 'test',
46
- sortable: {
47
- name: 'sort',
48
- scopeKey: 'status',
49
- },
50
- fields: [{ type: 'string', name: 'status' }],
51
- });
52
-
53
- await db.sync();
54
-
55
- const t1 = await Test.model.create({ status: 'publish' });
56
- const t2 = await Test.model.create({ status: 'publish' });
57
- const t3 = await Test.model.create({ status: 'draft' });
58
- const t4 = await Test.model.create({ status: 'draft' });
59
-
60
- expect(t1.get('sort')).toBe(1);
61
- expect(t2.get('sort')).toBe(2);
62
- expect(t3.get('sort')).toBe(1);
63
- expect(t4.get('sort')).toBe(2);
64
- });
65
- });
@@ -1,416 +0,0 @@
1
- import { Collection } from '../collection';
2
- import { Database } from '../database';
3
- import { mockDatabase } from './index';
4
- import { IdentifierError } from '../errors/identifier-error';
5
-
6
- const pgOnly = () => (process.env.DB_DIALECT == 'postgres' ? it : it.skip);
7
- describe('collection', () => {
8
- let db: Database;
9
-
10
- beforeEach(async () => {
11
- db = mockDatabase();
12
-
13
- await db.clean({ drop: true });
14
- });
15
-
16
- afterEach(async () => {
17
- await db.close();
18
- });
19
-
20
- it('should remove sequelize model prototype methods after field remove', async () => {
21
- db.collection({
22
- name: 'tags',
23
- });
24
-
25
- const UserCollection = db.collection({
26
- name: 'users',
27
- fields: [{ type: 'belongsToMany', name: 'tags' }],
28
- });
29
-
30
- console.log(Object.getOwnPropertyNames(UserCollection.model.prototype));
31
-
32
- await UserCollection.removeField('tags');
33
-
34
- console.log(Object.getOwnPropertyNames(UserCollection.model.prototype));
35
- // @ts-ignore
36
- expect(UserCollection.model.prototype.getTags).toBeUndefined();
37
- });
38
-
39
- it('should not throw error when create empty collection in sqlite and mysql', async () => {
40
- if (!db.inDialect('sqlite', 'mysql')) {
41
- return;
42
- }
43
-
44
- db.collection({
45
- name: 'empty',
46
- timestamps: false,
47
- autoGenId: false,
48
- fields: [],
49
- });
50
-
51
- let error;
52
-
53
- try {
54
- await db.sync({
55
- force: false,
56
- alter: {
57
- drop: false,
58
- },
59
- });
60
- } catch (e) {
61
- error = e;
62
- }
63
-
64
- expect(error).toBeUndefined();
65
- });
66
-
67
- pgOnly()('can create empty collection', async () => {
68
- db.collection({
69
- name: 'empty',
70
- timestamps: false,
71
- autoGenId: false,
72
- fields: [],
73
- });
74
-
75
- await db.sync({
76
- force: false,
77
- alter: {
78
- drop: false,
79
- },
80
- });
81
-
82
- expect(db.getCollection('empty')).toBeInstanceOf(Collection);
83
- });
84
-
85
- test('removeFromDb', async () => {
86
- await db.clean({ drop: true });
87
- const collection = db.collection({
88
- name: 'test',
89
- fields: [
90
- {
91
- type: 'string',
92
- name: 'name',
93
- },
94
- ],
95
- });
96
- await db.sync();
97
-
98
- const field = collection.getField('name');
99
- const r1 = await field.existsInDb();
100
- expect(r1).toBe(true);
101
- await field.removeFromDb();
102
- const r2 = await field.existsInDb();
103
- expect(r2).toBe(false);
104
-
105
- const r3 = await collection.existsInDb();
106
- expect(r3).toBe(true);
107
- await collection.removeFromDb();
108
- const r4 = await collection.existsInDb();
109
- expect(r4).toBe(false);
110
- });
111
-
112
- test('collection disable authGenId', async () => {
113
- const Test = db.collection({
114
- name: 'test',
115
- autoGenId: false,
116
- fields: [{ type: 'string', name: 'uid', primaryKey: true }],
117
- });
118
-
119
- const model = Test.model;
120
-
121
- await db.sync();
122
- expect(model.rawAttributes['id']).toBeUndefined();
123
- });
124
-
125
- test('new collection', async () => {
126
- const collection = new Collection(
127
- {
128
- name: 'test',
129
- },
130
- { database: db },
131
- );
132
-
133
- expect(collection.name).toEqual('test');
134
- });
135
-
136
- test('collection create field', async () => {
137
- const collection = new Collection(
138
- {
139
- name: 'user',
140
- },
141
- { database: db },
142
- );
143
-
144
- collection.addField('age', {
145
- type: 'integer',
146
- });
147
-
148
- const ageField = collection.getField('age');
149
- expect(ageField).toBeDefined();
150
- expect(collection.hasField('age')).toBeTruthy();
151
- expect(collection.hasField('test')).toBeFalsy();
152
-
153
- collection.removeField('age');
154
- expect(collection.hasField('age')).toBeFalsy();
155
- });
156
-
157
- test('collection set fields', () => {
158
- const collection = new Collection(
159
- {
160
- name: 'user',
161
- },
162
- { database: db },
163
- );
164
-
165
- collection.setFields([{ type: 'string', name: 'firstName' }]);
166
- expect(collection.hasField('firstName')).toBeTruthy();
167
- });
168
-
169
- test('update collection field', async () => {
170
- const collection = new Collection(
171
- {
172
- name: 'posts',
173
- fields: [{ type: 'string', name: 'title' }],
174
- },
175
- {
176
- database: db,
177
- },
178
- );
179
- expect(collection.hasField('title')).toBeTruthy();
180
-
181
- collection.updateField('title', {
182
- type: 'string',
183
- name: 'content',
184
- });
185
-
186
- expect(collection.hasField('title')).toBeFalsy();
187
- expect(collection.hasField('content')).toBeTruthy();
188
- });
189
-
190
- test('collection with association', async () => {
191
- const User = db.collection({
192
- name: 'users',
193
- fields: [
194
- { type: 'string', name: 'name' },
195
- { type: 'integer', name: 'age' },
196
- { type: 'hasMany', name: 'posts' },
197
- ],
198
- });
199
-
200
- const Post = db.collection({
201
- name: 'posts',
202
- fields: [
203
- { type: 'string', name: 'title' },
204
- { type: 'string', name: 'content' },
205
- {
206
- type: 'belongsTo',
207
- name: 'user',
208
- },
209
- {
210
- type: 'hasMany',
211
- name: 'comments',
212
- },
213
- ],
214
- });
215
-
216
- const Comment = db.collection({
217
- name: 'comments',
218
- fields: [
219
- { type: 'string', name: 'content' },
220
- { type: 'string', name: 'comment_as' },
221
- { type: 'belongsTo', name: 'post' },
222
- ],
223
- });
224
-
225
- expect(User.model.associations['posts']).toBeDefined();
226
- expect(Post.model.associations['comments']).toBeDefined();
227
-
228
- expect(User.model.associations['posts'].target.associations['comments']).toBeDefined();
229
- });
230
- });
231
-
232
- describe('collection sync', () => {
233
- let db: Database;
234
-
235
- beforeEach(async () => {
236
- db = mockDatabase();
237
- });
238
-
239
- afterEach(async () => {
240
- await db.close();
241
- });
242
-
243
- test('sync fields', async () => {
244
- const collection = new Collection(
245
- {
246
- name: 'users',
247
- },
248
- { database: db },
249
- );
250
-
251
- collection.setFields([
252
- { type: 'string', name: 'firstName' },
253
- { type: 'string', name: 'lastName' },
254
- { type: 'integer', name: 'age' },
255
- ]);
256
-
257
- await collection.sync();
258
- const tableFields = await (<any>collection.model).queryInterface.describeTable(`${db.getTablePrefix()}users`);
259
-
260
- if (db.options.underscored) {
261
- expect(tableFields).toHaveProperty('first_name');
262
- expect(tableFields).toHaveProperty('last_name');
263
- expect(tableFields).toHaveProperty('age');
264
- } else {
265
- expect(tableFields).toHaveProperty('firstName');
266
- expect(tableFields).toHaveProperty('lastName');
267
- expect(tableFields).toHaveProperty('age');
268
- }
269
- });
270
-
271
- test('sync with association not exists', async () => {
272
- const collection = new Collection(
273
- {
274
- name: 'posts',
275
- fields: [
276
- { type: 'string', name: 'title' },
277
- { type: 'belongsTo', name: 'users' },
278
- ],
279
- },
280
- { database: db },
281
- );
282
-
283
- await collection.sync();
284
-
285
- const model = collection.model;
286
-
287
- const tableFields = await (<any>model).queryInterface.describeTable(`${db.getTablePrefix()}posts`);
288
-
289
- expect(tableFields['userId']).toBeUndefined();
290
- });
291
-
292
- test('sync with association', async () => {
293
- new Collection(
294
- {
295
- name: 'tags',
296
- fields: [{ type: 'string', name: 'name' }],
297
- },
298
- { database: db },
299
- );
300
-
301
- const collection = new Collection(
302
- {
303
- name: 'posts',
304
- fields: [
305
- { type: 'string', name: 'title' },
306
- { type: 'belongsToMany', name: 'tags' },
307
- ],
308
- },
309
- {
310
- database: db,
311
- },
312
- );
313
-
314
- const model = collection.model;
315
- await collection.sync();
316
- if (db.options.underscored) {
317
- const tableFields = await (<any>model).queryInterface.describeTable(`${db.getTablePrefix()}posts_tags`);
318
- expect(tableFields['post_id']).toBeDefined();
319
- expect(tableFields['tag_id']).toBeDefined();
320
- } else {
321
- const tableFields = await (<any>model).queryInterface.describeTable(`${db.getTablePrefix()}postsTags`);
322
- expect(tableFields['postId']).toBeDefined();
323
- expect(tableFields['tagId']).toBeDefined();
324
- }
325
- });
326
-
327
- test('limit table name length', async () => {
328
- const longName =
329
- 'this_is_a_very_long_table_name_that_should_be_truncated_this_is_a_very_long_table_name_that_should_be_truncated';
330
-
331
- let error;
332
-
333
- try {
334
- const collection = new Collection(
335
- {
336
- name: longName,
337
- fields: [{ type: 'string', name: 'test' }],
338
- },
339
- {
340
- database: db,
341
- },
342
- );
343
- } catch (e) {
344
- error = e;
345
- }
346
-
347
- expect(error).toBeInstanceOf(IdentifierError);
348
- });
349
-
350
- it('should throw error when collection has same table name and same schema', async () => {
351
- const c1 = db.collection({
352
- name: 'test',
353
- tableName: 'test',
354
- schema: 'public',
355
- });
356
-
357
- let err;
358
-
359
- try {
360
- const c2 = db.collection({
361
- name: 'test2',
362
- tableName: 'test',
363
- schema: 'public',
364
- });
365
- } catch (e) {
366
- err = e;
367
- }
368
-
369
- expect(err.message).toContain('have same tableName');
370
- });
371
-
372
- it('should allow same table name in difference schema', async () => {
373
- const c1 = db.collection({
374
- name: 'test',
375
- tableName: 'test',
376
- schema: 'public',
377
- });
378
-
379
- let err;
380
-
381
- try {
382
- const c2 = db.collection({
383
- name: 'test2',
384
- tableName: 'test',
385
- schema: 'other_schema',
386
- });
387
- } catch (e) {
388
- err = e;
389
- }
390
-
391
- expect(err).toBeFalsy();
392
- });
393
-
394
- test('limit field name length', async () => {
395
- const longFieldName =
396
- 'this_is_a_very_long_field_name_that_should_be_truncated_this_is_a_very_long_field_name_that_should_be_truncated';
397
-
398
- let error;
399
-
400
- try {
401
- const collection = new Collection(
402
- {
403
- name: 'test',
404
- fields: [{ type: 'string', name: longFieldName }],
405
- },
406
- {
407
- database: db,
408
- },
409
- );
410
- } catch (e) {
411
- error = e;
412
- }
413
-
414
- expect(error).toBeInstanceOf(IdentifierError);
415
- });
416
- });
@@ -1,33 +0,0 @@
1
- import { mockDatabase } from './index';
2
- import path from 'path';
3
- import Database from '../database';
4
-
5
- describe('database', () => {
6
- let db: Database;
7
-
8
- beforeEach(() => {
9
- db = mockDatabase();
10
- });
11
-
12
- afterEach(async () => {
13
- await db.close();
14
- });
15
-
16
- test('import', async () => {
17
- await db.import({
18
- directory: path.resolve(__dirname, './fixtures/c0'),
19
- });
20
- await db.import({
21
- directory: path.resolve(__dirname, './fixtures/c1'),
22
- });
23
- await db.import({
24
- directory: path.resolve(__dirname, './fixtures/c2'),
25
- });
26
-
27
- const test = db.getCollection('tests');
28
-
29
- expect(test.getField('n0')).toBeDefined();
30
- expect(test.getField('n1')).toBeDefined();
31
- expect(test.getField('n2')).toBeDefined();
32
- });
33
- });