/
value-transformer.ts
154 lines (116 loc) · 5.96 KB
/
value-transformer.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
import "reflect-metadata";
import {closeTestingConnections, createTestingConnections, reloadTestingDatabases} from "../../../utils/test-utils";
import {Connection} from "../../../../src/connection/Connection";
import {PhoneBook} from "./entity/PhoneBook";
import {Complex, Post} from "./entity/Post";
import {User} from "./entity/User";
import {Category} from "./entity/Category";
import {View} from "./entity/View";
import {expect} from "chai";
describe("columns > value-transformer functionality", () => {
let connections: Connection[];
before(async () => connections = await createTestingConnections({
entities: [Post, PhoneBook, User, Category, View],
}));
beforeEach(() => reloadTestingDatabases(connections));
after(() => closeTestingConnections(connections));
it("should marshal data using the provided value-transformer", () => Promise.all(connections.map(async connection => {
const postRepository = connection.getRepository(Post);
// create and save a post first
const post = new Post();
post.title = "About columns";
post.tags = ["simple", "transformer"];
await postRepository.save(post);
// then update all its properties and save again
post.title = "About columns1";
post.tags = ["very", "simple"];
await postRepository.save(post);
// check if all columns are updated except for readonly columns
const loadedPost = await postRepository.findOne(post.id);
expect(loadedPost!.title).to.be.equal("About columns1");
expect(loadedPost!.tags).to.deep.eq(["very", "simple"]);
const phoneBookRepository = connection.getRepository(PhoneBook);
const phoneBook = new PhoneBook();
phoneBook.name = "George";
phoneBook.phones = new Map();
phoneBook.phones.set("work", 123456);
phoneBook.phones.set("mobile", 1234567);
await phoneBookRepository.save(phoneBook);
const loadedPhoneBook = await phoneBookRepository.findOne(phoneBook.id);
expect(loadedPhoneBook!.name).to.be.equal("George");
expect(loadedPhoneBook!.phones).not.to.be.undefined;
expect(loadedPhoneBook!.phones.get("work")).to.equal(123456);
expect(loadedPhoneBook!.phones.get("mobile")).to.equal(1234567);
})));
it("should apply three transformers in the right order", () => Promise.all(connections.map(async connection => {
const userRepository = await connection.getRepository(User);
const email = `${connection.name}@JOHN.doe`;
const user = new User();
user.email = email;
await userRepository.save(user);
const dbUser = await userRepository.findOne();
dbUser && dbUser.email.should.be.eql(email.toLocaleLowerCase());
})));
it("should apply all the transformers", () => Promise.all(connections.map(async connection => {
const categoryRepository = await connection.getRepository(Category);
const description = ` ${connection.name}-DESCRIPTION `;
const category = new Category();
category.description = description;
await categoryRepository.save(category);
const dbCategory = await categoryRepository.findOne();
dbCategory && dbCategory.description.should.be.eql(description.toLocaleLowerCase().trim());
})));
it("should apply no transformer", () => Promise.all(connections.map(async connection => {
const viewRepository = await connection.getRepository(View);
const title = `${connection.name}`;
const view = new View();
view.title = title;
await viewRepository.save(view);
const dbView = await viewRepository.findOne();
dbView && dbView.title.should.be.eql(title);
})));
it("should marshal data using a complex value-transformer", () => Promise.all(connections.map(async connection => {
const postRepository = connection.getRepository(Post);
// create and save a post first
const post = new Post();
post.title = "Complex transformers!";
post.tags = ["complex", "transformer"];
await postRepository.save(post);
let loadedPost = await postRepository.findOne(post.id);
expect(loadedPost!.complex).to.eq(null);
// then update all its properties and save again
post.title = "Complex transformers2!";
post.tags = ["very", "complex", "actually"];
post.complex = new Complex("3 2.5");
await postRepository.save(post);
// check if all columns are updated except for readonly columns
loadedPost = await postRepository.findOne(post.id);
expect(loadedPost!.title).to.be.equal("Complex transformers2!");
expect(loadedPost!.tags).to.deep.eq(["very", "complex", "actually"]);
expect(loadedPost!.complex!.x).to.eq(3);
expect(loadedPost!.complex!.y).to.eq(2.5);
// then update all its properties and save again
post.title = "Complex transformers3!";
post.tags = ["very", "lacking", "actually"];
post.complex = null;
await postRepository.save(post);
loadedPost = await postRepository.findOne(post.id);
expect(loadedPost!.complex).to.eq(null);
// then update all its properties and save again
post.title = "Complex transformers4!";
post.tags = ["very", "here", "again!"];
post.complex = new Complex("0.5 0.5");
await postRepository.save(post);
loadedPost = await postRepository.findOne(post.id);
expect(loadedPost!.complex!.x).to.eq(0.5);
expect(loadedPost!.complex!.y).to.eq(0.5);
// then update all its properties and save again
post.title = "Complex transformers5!";
post.tags = ["now", "really", "lacking!"];
post.complex = new Complex("1.05 2.3");
await postRepository.save(post);
loadedPost = await postRepository.findOne(post.id);
expect(loadedPost!.complex!.x).to.eq(1.05);
expect(loadedPost!.complex!.y).to.eq(2.3);
})));
});