Skip to content

Commit

Permalink
Improvement: spec cleanup.
Browse files Browse the repository at this point in the history
  • Loading branch information
dpimonov committed Oct 18, 2023
1 parent f4dd63f commit 599895e
Show file tree
Hide file tree
Showing 2 changed files with 77 additions and 42 deletions.
2 changes: 1 addition & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [7.2.0] - 2023-10-14
## [7.2.0] - 2023-10-18

### Added

Expand Down
117 changes: 76 additions & 41 deletions spec/use-cases/complex-polymorphic-types.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,23 +3,34 @@ import { Property, Type, TypeManager } from '../../src';
@Type()
class Message
{
constructor (content: string, sender: Messageable, reciever: Messageable) {
@Property(() => Messageable) public sender: Messageable
@Property(() => Messageable) public reciever: Messageable
@Property(String) public content: string

public constructor (content: string, sender: Messageable, reciever: Messageable)
{
this.content = content;
this.sender = sender;
this.reciever = reciever;

return;
}
@Property(() => Messageable) public sender: Messageable
@Property(() => Messageable) public reciever: Messageable
@Property(String) public content: string
}

@Type()
class Status
{
constructor (status: string) {
@Property(String) status: string;

public constructor (status: string)
{
this.status = status;

return;
}
@Property(String) status: string;

}

abstract class Messageable
{
@Property(Array, [Message]) messages!: Message[];
Expand All @@ -38,33 +49,40 @@ abstract class Statusable
}

@Type({
discriminator: '__typename__',
discriminant: 'Chat',
parentTypeFns: [HasTitle],
parentTypeFns: [HasTitle]
})
class Chat extends Messageable implements HasTitle
{
constructor (title: string) {
super()
@Property(String) title: string;

public constructor (title: string)
{
super();

this.title = title;
}

@Property(String) title: string;
return;
}
}

@Type({
discriminator: '__typename__',
discriminant: 'User',
parentTypeFns: [Messageable, HasTitle],
parentTypeFns: [Messageable, HasTitle]
})
class User extends Statusable implements Messageable, HasTitle
{
constructor (title: string) {
@Property(String) title: string;
@Property(Array, [Message]) messages!: Message[];

constructor (title: string)
{
super();

this.title = title;

return;
}
@Property(String) title: string;
@Property(Array, [Message]) messages!: Message[];
}

describe('Polymorphic types', () =>
Expand Down Expand Up @@ -92,28 +110,34 @@ describe('Polymorphic types', () =>
i % 2 ? user : chat,
i % 2 ? chat : user
));

const statuses = [...Array(statusCount)].map((_, i) => new Status(i.toString()));

user.messages = messages.filter(m => m.sender === user);
chat.messages = messages.filter(m => m.sender === chat);
user.statuses = statuses;

const results = messages.map(message => TypeManager.serialize(Message, message));

expect(results.length).toBe(messageCount);
results.forEach((result, i) => {

results.forEach((result, i) =>
{
expect(result).toBeInstanceOf(Object);
expect(result.$type).toBe('Message');
// expect(result.sender.$type).toBe(i % 2 ? 'User' : 'Chat');
expect(result.sender.__typename__).toBe(i % 2 ? 'User' : 'Chat');
// expect(result.reciever.$type).toBe(i % 2 ? 'Chat' : 'User');
expect(result.reciever.__typename__).toBe(i % 2 ? 'Chat' : 'User');
expect(result.sender.$type).toBe(i % 2 ? 'User' : 'Chat');
expect(result.reciever.$type).toBe(i % 2 ? 'Chat' : 'User');
expect(result.sender.title).toBe(i % 2 ? 'user-a' : 'chat-b');
const _user = i % 2 ? result.sender : result.reciever;
expect(_user.statuses.length).toBe(statusCount);
_user.statuses.forEach((status: any, i: number) => {

const testUser = i % 2 ? result.sender : result.reciever;

expect(testUser.statuses.length).toBe(statusCount);

testUser.statuses.forEach((status: any, i: number) =>
{
expect(status.status).toBe(i.toString());
})
})
});
});

it('should be properly deserialized', () =>
Expand All @@ -125,36 +149,47 @@ describe('Polymorphic types', () =>
const messageCount = 5;
const statusCount = 3;

const statuses = [...Array(statusCount)].map((_, i) => {
const statuses = [...Array(statusCount)].map((_, i) =>
{
return { $type: 'Status', status: i.toString() }
})
const user = { $type: 'User', __typename__: 'User', title: 'user-b', messages: [] as Record<string, any>[], statuses };
const chat = { $type: 'Chat', __typename__: 'Chat', title: 'chat-b', messages: [] as Record<string, any>[] };
const messages = [...Array(messageCount)].map((_, i) => {
});

const user = { $type: 'User', title: 'user-b', messages: [] as Record<string, any>[], statuses };
const chat = { $type: 'Chat', title: 'chat-b', messages: [] as Record<string, any>[] };

const messages = [...Array(messageCount)].map((_, i) =>
{
return {
$type: 'Message',
content: i.toString(),
sender: i % 2 ? user : chat,
reciever: i % 2 ? chat : user
}
})
};
});

user.messages = messages.filter(m => m.sender === user);
chat.messages = messages.filter(m => m.sender === chat);

const results = messages.map(message => TypeManager.deserialize(Message, message));

expect(results.length).toBe(messageCount);

results.forEach((result, i) => {
results.forEach((result, i) =>
{
expect(result).toBeInstanceOf(Message);
expect(result.sender).toBeInstanceOf(i % 2 ? User : Chat);
expect(result.reciever).toBeInstanceOf(i % 2 ? Chat : User);
const _user = (i % 2 ? result.sender : result.reciever) as User;
expect(_user).toBeInstanceOf(User);
expect(_user.title).toBe('user-b');
expect(_user.statuses.length).toBe(statusCount);
_user.statuses.forEach((status, i) => {

const testUser = (i % 2 ? result.sender : result.reciever) as User;

expect(testUser).toBeInstanceOf(User);
expect(testUser.title).toBe('user-b');
expect(testUser.statuses.length).toBe(statusCount);

testUser.statuses.forEach((status, i) =>
{
expect(status.status).toBe(i.toString())
})
})
});
});
});
});

0 comments on commit 599895e

Please sign in to comment.