Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(datastore): optional hasOne #10685 #10688

Merged
merged 6 commits into from Nov 18, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
54 changes: 51 additions & 3 deletions packages/datastore/__tests__/commonAdapterTests.ts
Expand Up @@ -24,6 +24,8 @@ import {
CompositePKParent,
HasOneParent,
HasOneChild,
DefaultPKHasOneParent,
DefaultPKHasOneChild,
} from './helpers';

export { pause };
Expand Down Expand Up @@ -370,14 +372,25 @@ export function addCommonQueryTests({
let Post: PersistentModelConstructor<Post>;
let HasOneParent: PersistentModelConstructor<HasOneParent>;
let HasOneChild: PersistentModelConstructor<HasOneChild>;
let DefaultPKHasOneParent: PersistentModelConstructor<DefaultPKHasOneParent>;
let DefaultPKHasOneChild: PersistentModelConstructor<DefaultPKHasOneChild>;

beforeEach(async () => {
const classes = initSchema(testSchema());
({ Comment, Post, HasOneParent, HasOneChild } = classes as {
({
Comment,
Post,
HasOneParent,
HasOneChild,
DefaultPKHasOneParent,
DefaultPKHasOneChild,
} = classes as {
Comment: PersistentModelConstructor<Comment>;
Post: PersistentModelConstructor<Post>;
HasOneParent: PersistentModelConstructor<HasOneParent>;
HasOneChild: PersistentModelConstructor<HasOneChild>;
DefaultPKHasOneParent: PersistentModelConstructor<DefaultPKHasOneParent>;
DefaultPKHasOneChild: PersistentModelConstructor<DefaultPKHasOneChild>;
});
});

Expand Down Expand Up @@ -517,7 +530,7 @@ export function addCommonQueryTests({
});

(isSQLiteAdapter() ? test.skip : test)(
'deleting disconnected hasOne',
'deleting disconnected hasOne with cpk',
async () => {
const hasOneParent = await DataStore.save(new HasOneParent({}));

Expand All @@ -530,7 +543,7 @@ export function addCommonQueryTests({
);

(isSQLiteAdapter() ? test.skip : test)(
'deleting connected hasOne',
'deleting connected hasOne with cpk',
async () => {
const hasOneChild = await DataStore.save(new HasOneChild({}));
const hasOneParent = await DataStore.save(
Expand All @@ -548,6 +561,41 @@ export function addCommonQueryTests({
).toBeUndefined();
}
);

(isSQLiteAdapter() ? test.skip : test)(
svidgen marked this conversation as resolved.
Show resolved Hide resolved
'deleting disconnected hasOne without cpk',
async () => {
const hasOneParent = await DataStore.save(
new DefaultPKHasOneParent({})
);

await DataStore.delete(hasOneParent);

expect(
await DataStore.query(DefaultPKHasOneParent, hasOneParent.id)
).toBeUndefined();
}
);

(isSQLiteAdapter() ? test.skip : test)(
'deleting connected hasOne without cpk',
async () => {
const hasOneChild = await DataStore.save(new DefaultPKHasOneChild({}));
const hasOneParent = await DataStore.save(
new DefaultPKHasOneParent({ child: hasOneChild })
);

await DataStore.delete(hasOneParent);

expect(
await DataStore.query(DefaultPKHasOneParent, hasOneParent.id)
).toBeUndefined();

expect(
await DataStore.query(DefaultPKHasOneChild, hasOneChild.id)
).toBeUndefined();
}
);
});

describe('Related models', () => {
Expand Down
143 changes: 143 additions & 0 deletions packages/datastore/__tests__/helpers.ts
Expand Up @@ -996,6 +996,8 @@ export function getDataStore({ online = false, isNode = true } = {}) {
DefaultPKChild,
HasOneParent,
HasOneChild,
DefaultPKHasOneParent,
DefaultPKHasOneChild,
} = classes as {
ModelWithBoolean: PersistentModelConstructor<ModelWithBoolean>;
Post: PersistentModelConstructor<Post>;
Expand All @@ -1010,6 +1012,8 @@ export function getDataStore({ online = false, isNode = true } = {}) {
DefaultPKChild: PersistentModelConstructor<DefaultPKChild>;
HasOneParent: PersistentModelConstructor<HasOneParent>;
HasOneChild: PersistentModelConstructor<HasOneChild>;
DefaultPKHasOneParent: PersistentModelConstructor<DefaultPKHasOneParent>;
DefaultPKHasOneChild: PersistentModelConstructor<DefaultPKHasOneChild>;
};

return {
Expand All @@ -1031,6 +1035,8 @@ export function getDataStore({ online = false, isNode = true } = {}) {
DefaultPKChild,
HasOneParent,
HasOneChild,
DefaultPKHasOneParent,
DefaultPKHasOneChild,
};
}

Expand Down Expand Up @@ -1313,6 +1319,36 @@ export declare class DefaultPKChild {
): DefaultPKChild;
}

export declare class DefaultPKHasOneParent {
readonly id: string;
readonly content?: string | null;
readonly child?: Promise<DefaultPKHasOneChild>;
readonly createdAt?: string | null;
readonly updatedAt?: string | null;
constructor(init: ModelInit<DefaultPKParent>);
static copyOf(
source: DefaultPKHasOneParent,
mutator: (
draft: MutableModel<DefaultPKHasOneParent>
) => MutableModel<DefaultPKHasOneParent> | void
): DefaultPKHasOneParent;
}

export declare class DefaultPKHasOneChild {
readonly id: string;
readonly content?: string | null;
readonly createdAt?: string | null;
readonly updatedAt?: string | null;
readonly defaultPKHasOneParentChildrenId?: string | null;
constructor(init: ModelInit<DefaultPKHasOneChild>);
static copyOf(
source: DefaultPKHasOneChild,
mutator: (
draft: MutableModel<DefaultPKHasOneChild>
) => MutableModel<DefaultPKHasOneChild> | void
): DefaultPKHasOneChild;
}

/**
* This is it.
*/
Expand Down Expand Up @@ -2335,6 +2371,113 @@ export function testSchema(): Schema {
},
],
},
DefaultPKHasOneParent: {
name: 'DefaultPKHasOneParent',
fields: {
id: {
name: 'id',
isArray: false,
type: 'ID',
isRequired: true,
attributes: [],
},
content: {
name: 'content',
isArray: false,
type: 'String',
isRequired: false,
attributes: [],
},
child: {
name: 'child',
isArray: false,
type: {
model: 'DefaultPKHasOneChild',
},
isRequired: false,
attributes: [],
association: {
connectionType: 'HAS_ONE',
associatedWith: 'id',
targetName: 'defaultPKHasOneParentChildId',
},
},
createdAt: {
name: 'createdAt',
isArray: false,
type: 'AWSDateTime',
isRequired: false,
attributes: [],
isReadOnly: true,
},
updatedAt: {
name: 'updatedAt',
isArray: false,
type: 'AWSDateTime',
isRequired: false,
attributes: [],
isReadOnly: true,
},
defaultPKHasOneParentChildId: {
name: 'defaultPKHasOneParentChildId',
isArray: false,
type: 'ID',
isRequired: false,
attributes: [],
},
},
syncable: true,
pluralName: 'DefaultPKHasOneParents',
attributes: [
{
type: 'model',
properties: {},
},
],
},
DefaultPKHasOneChild: {
name: 'DefaultPKHasOneChild',
fields: {
id: {
name: 'id',
isArray: false,
type: 'ID',
isRequired: true,
attributes: [],
},
content: {
name: 'content',
isArray: false,
type: 'String',
isRequired: false,
attributes: [],
},
createdAt: {
name: 'createdAt',
isArray: false,
type: 'AWSDateTime',
isRequired: false,
attributes: [],
isReadOnly: true,
},
updatedAt: {
name: 'updatedAt',
isArray: false,
type: 'AWSDateTime',
isRequired: false,
attributes: [],
isReadOnly: true,
},
},
syncable: true,
pluralName: 'DefaultPKHasOneChildren',
attributes: [
{
type: 'model',
properties: {},
},
],
},
CompositePKParent: {
name: 'CompositePKParent',
fields: {
Expand Down
Expand Up @@ -887,6 +887,7 @@ class IndexedDBAdapter implements Adapter {
if (targetName && targetName in model) {
index = hasOneIndex;
const value = model[targetName];
if (value === null) break;
values = [value];
} else {
// backwards compatability for older versions of codegen that did not emit targetName for HAS_ONE relations
Expand Down