diff --git a/packages/react-binding/tests/cases/unit/core/entityOperations.test.tsx b/packages/react-binding/tests/cases/unit/core/entityOperations.test.tsx
index bd27e87a17..40b76a096e 100644
--- a/packages/react-binding/tests/cases/unit/core/entityOperations.test.tsx
+++ b/packages/react-binding/tests/cases/unit/core/entityOperations.test.tsx
@@ -1,43 +1,31 @@
import { describe, expect, it } from 'vitest'
-import { EntitySubTree, Field } from '../../../../src'
-import { createBindingWithEntitySubtree } from './bindingFactory'
+import { EntitySubTree, Field, HasOne } from '../../../../src'
+import { createBinding } from '../../../lib/bindingFactory'
+import { c, createSchema } from '@contember/schema-definition'
+import { convertModelToAdminSchema } from '../../../lib/convertModelToAdminSchema'
+import assert from 'assert'
+
+
+namespace TrackChangesModel {
+ export class Foo {
+ fooField = c.stringColumn()
+ }
+}
describe('entity operations', () => {
it('tracks unpersisted changes count', () => {
- const { entity } = createBindingWithEntitySubtree({
+ const { treeStore } = createBinding({
node: (
),
- schema: {
- enums: [],
- entities: [{
- name: 'Foo',
- customPrimaryAllowed: false,
- unique: [],
- fields: [
- {
- __typename: '_Column',
- name: 'id',
- nullable: false,
- defaultValue: null,
- type: 'Uuid',
- enumName: null,
- },
- {
- __typename: '_Column',
- type: 'String',
- enumName: null,
- nullable: true,
- defaultValue: null,
- name: 'fooField',
- },
-],
- }],
- },
+ schema: convertModelToAdminSchema(createSchema(TrackChangesModel).model),
})
+ const entity = Array.from(treeStore.subTreeStatesByRoot.get(undefined)!.values())[0]
+ assert(entity.type === 'entityRealm')
+
expect(entity.unpersistedChangesCount).eq(0)
entity.getAccessor().getField('fooField').updateValue('bar')
expect(entity.unpersistedChangesCount).eq(1)
diff --git a/packages/react-binding/tests/cases/unit/core/eventManager.test.tsx b/packages/react-binding/tests/cases/unit/core/eventManager.test.tsx
index 6ff578ac34..325c5b033b 100644
--- a/packages/react-binding/tests/cases/unit/core/eventManager.test.tsx
+++ b/packages/react-binding/tests/cases/unit/core/eventManager.test.tsx
@@ -1,41 +1,28 @@
import { describe, expect, it } from 'vitest'
import { EntityAccessor, EntitySubTree, Field } from '../../../../src'
-import { createBindingWithEntitySubtree } from './bindingFactory'
+import { createBinding } from '../../../lib/bindingFactory'
+import { c, createSchema } from '@contember/schema-definition'
+import { convertModelToAdminSchema } from '../../../lib/convertModelToAdminSchema'
+import assert from 'assert'
+
+namespace EventManagerModel {
+ export class Foo {
+ fooField = c.stringColumn()
+ }
+}
const prepareBeforePersistTest = ({ event }: { event: (getAccessor: () => EntityAccessor) => any }) => {
- return createBindingWithEntitySubtree({
+ const { treeStore, eventManager } = createBinding({
node: (
),
- schema: {
- enums: [],
- entities: [{
- name: 'Foo',
- customPrimaryAllowed: false,
- unique: [],
- fields: [
- {
- __typename: '_Column',
- name: 'id',
- nullable: false,
- defaultValue: null,
- type: 'Uuid',
- enumName: null,
- },
- {
- __typename: '_Column',
- type: 'String',
- enumName: null,
- nullable: true,
- defaultValue: null,
- name: 'fooField',
- },
- ],
- }],
- },
+ schema: convertModelToAdminSchema(createSchema(EventManagerModel).model),
})
+ const entity = Array.from(treeStore.subTreeStatesByRoot.get(undefined)!.values())[0]
+ assert(entity.type === 'entityRealm')
+ return { entity, eventManager }
}
describe('event manager', () => {
diff --git a/packages/react-binding/tests/cases/unit/core/bindingFactory.ts b/packages/react-binding/tests/lib/bindingFactory.ts
similarity index 50%
rename from packages/react-binding/tests/cases/unit/core/bindingFactory.ts
rename to packages/react-binding/tests/lib/bindingFactory.ts
index 1ca2f744b7..db64a3dfe3 100644
--- a/packages/react-binding/tests/cases/unit/core/bindingFactory.ts
+++ b/packages/react-binding/tests/lib/bindingFactory.ts
@@ -1,21 +1,9 @@
-import assert from 'assert'
import { ReactNode } from 'react'
-import {
- Config,
- DirtinessTracker,
- Environment,
- EventManager,
- RawSchema,
- Schema,
- SchemaPreprocessor,
- StateInitializer,
- TreeAugmenter,
- TreeStore,
-} from '@contember/binding'
-import { MarkerTreeGenerator } from '../../../../src'
+import { Config, DirtinessTracker, Environment, EventManager, Schema, SchemaStore, StateInitializer, TreeAugmenter, TreeStore } from '@contember/binding'
+import { MarkerTreeGenerator } from '../../src'
-export const createBindingWithEntitySubtree = ({ node, schema }: {node: ReactNode, schema: RawSchema}) => {
- const finalSchema = new Schema(SchemaPreprocessor.processRawSchema(schema))
+export const createBinding = ({ node, schema }: { node: ReactNode, schema: SchemaStore }) => {
+ const finalSchema = new Schema(schema)
const treeStore = new TreeStore(finalSchema)
const environment = Environment.create().withSchema(finalSchema)
const generator = new MarkerTreeGenerator(node, environment)
@@ -31,8 +19,5 @@ export const createBindingWithEntitySubtree = ({ node, schema }: {node: ReactNod
const treeAugmenter = new TreeAugmenter(eventManager, stateInitializer, treeStore)
treeAugmenter.extendTreeStates(undefined, generator.generate())
- const entity = Array.from(treeStore.subTreeStatesByRoot.get(undefined)!.values())[0]
- assert(entity.type === 'entityRealm')
-
- return { entity, eventManager }
+ return { eventManager, treeStore, environment }
}
diff --git a/packages/react-binding/tests/lib/convertModelToAdminSchema.ts b/packages/react-binding/tests/lib/convertModelToAdminSchema.ts
new file mode 100644
index 0000000000..90538b9447
--- /dev/null
+++ b/packages/react-binding/tests/lib/convertModelToAdminSchema.ts
@@ -0,0 +1,131 @@
+import { SchemaEntities, SchemaField, SchemaStore } from '@contember/binding'
+import { Model } from '@contember/schema'
+import { acceptFieldVisitor } from '@contember/schema-utils'
+
+export const convertModelToAdminSchema = (model: Model.Schema): SchemaStore => {
+ const enums: SchemaStore['enums'] = new Map()
+ for (const [name, values] of Object.entries(model.enums)) {
+ enums.set(name, new Set(values))
+ }
+ const entities: SchemaEntities = new Map()
+ for (const entity of Object.values(model.entities)) {
+ entities.set(entity.name, {
+ name: entity.name,
+ customPrimaryAllowed: false, // todo
+ unique: Object.values(entity.unique).map(it => ({
+ fields: new Set(it.fields),
+ })),
+ fields: new Map(Object.values(entity.fields).map((it): [string, SchemaField] => {
+ const schemaField = acceptFieldVisitor(model, entity, it, {
+ visitColumn: ({ column }) => {
+ return {
+ __typename: '_Column',
+ name: column.name,
+ nullable: column.nullable,
+ type: column.type,
+ defaultValue: column.default ?? null,
+ enumName: column.type === Model.ColumnType.Enum ? column.columnType : null,
+ }
+ },
+ visitManyHasManyInverse: ({ relation }) => {
+ return {
+ __typename: '_Relation',
+ type: 'ManyHasMany',
+ name: relation.name,
+ side: 'inverse',
+ ownedBy: relation.ownedBy,
+ targetEntity: relation.target,
+ nullable: null,
+ onDelete: null,
+ orphanRemoval: null,
+ // todo
+ orderBy: null,
+ }
+ },
+ visitManyHasManyOwning: ({ relation }) => {
+ return {
+ __typename: '_Relation',
+ type: 'ManyHasMany',
+ name: relation.name,
+ side: 'owning',
+ inversedBy: relation.inversedBy ?? null,
+ targetEntity: relation.target,
+ nullable: null,
+ onDelete: null,
+ orphanRemoval: null,
+ // todo
+ orderBy: null,
+ }
+ },
+ visitManyHasOne: ({ relation }) => {
+ return {
+ __typename: '_Relation',
+ type: 'ManyHasOne',
+ name: relation.name,
+ side: 'owning',
+ inversedBy: relation.inversedBy ?? null,
+ targetEntity: relation.target,
+ nullable: relation.nullable,
+ orphanRemoval: null,
+ orderBy: null,
+ // todo
+ onDelete: null,
+ }
+ },
+ visitOneHasMany: ({ relation }) => {
+ return {
+ __typename: '_Relation',
+ type: 'OneHasMany',
+ name: relation.name,
+ side: 'inverse',
+ ownedBy: relation.ownedBy,
+ targetEntity: relation.target,
+ nullable: null,
+ orphanRemoval: null,
+ onDelete: null,
+ // todo
+ orderBy: null,
+ }
+ },
+ visitOneHasOneInverse: ({ relation }) => {
+ return {
+ __typename: '_Relation',
+ type: 'ManyHasOne',
+ name: relation.name,
+ side: 'inverse',
+ ownedBy: relation.ownedBy,
+ targetEntity: relation.target,
+ nullable: relation.nullable,
+ orderBy: null,
+ orphanRemoval: null,
+ onDelete: null,
+ }
+ },
+ visitOneHasOneOwning: ({ relation }) => {
+ return {
+ __typename: '_Relation',
+ type: 'ManyHasOne',
+ name: relation.name,
+ side: 'owning',
+ inversedBy: relation.inversedBy ?? null,
+ targetEntity: relation.target,
+ nullable: relation.nullable,
+ orderBy: null,
+ // todo
+ onDelete: null,
+ orphanRemoval: null,
+ }
+ },
+ })
+ return [
+ it.name,
+ schemaField,
+ ]
+ })),
+ })
+ }
+ return {
+ enums,
+ entities,
+ }
+}