1 | import env from 'dotenv';
|
2 | import fs from 'fs';
|
3 | import { Buffer } from 'buffer';
|
4 | import path from 'path';
|
5 | import { Vika } from '../lib';
|
6 | import { IDatasheetCreateRo, INodeItem, IRecord } from '../lib/interface';
|
7 | import { IDatasheetFieldCreateRo } from '../lib/interface/datasheet.field.create.ro';
|
8 | import { PermissionType, EmbedLinkTheme } from '../lib/interface/embed.link';
|
9 | import { IAddOpenSingleTextFieldProperty } from '../lib/interface/field.create.property';
|
10 |
|
11 | env.config();
|
12 |
|
13 | jest.setTimeout(30000);
|
14 |
|
15 | describe('full pipeline', () => {
|
16 | const host = process.env.DOMAIN ? `https://${process.env.DOMAIN}/fusion/v1` : undefined;
|
17 | const token = process.env.TOKEN as string;
|
18 | const datasheetId = process.env.DATASHEET_ID as string;
|
19 | const folderId = process.env.FOLDER_ID as string;
|
20 | const spaceId = process.env.SPACE_ID as string;
|
21 | const viewId = process.env.VIEW_ID as string;
|
22 |
|
23 | const apitable = new Vika({
|
24 | token,
|
25 | host,
|
26 | });
|
27 |
|
28 | const datasheet = apitable.datasheet(datasheetId);
|
29 |
|
30 | let records: IRecord[];
|
31 | let spaceIds: string[];
|
32 | let nodes: INodeItem[];
|
33 | let createdDatasheetId: string;
|
34 | let createdFieldId: string;
|
35 |
|
36 | it('fieldKey', async () => {
|
37 | const apitable = new Vika({
|
38 | token,
|
39 | host,
|
40 | fieldKey: 'id',
|
41 | });
|
42 | const datasheet = apitable.datasheet(datasheetId);
|
43 | console.time('list records');
|
44 | const result = await datasheet.records.query();
|
45 | console.timeEnd('list records');
|
46 | if (!result.success) {
|
47 | console.error(result);
|
48 | }
|
49 | expect(result.success).toBeTruthy();
|
50 | records = result.data!.records;
|
51 | expect(Object.keys(records[0].fields).every(key => key.startsWith('fld'))).toBeTruthy();
|
52 | });
|
53 |
|
54 | it('list records', async () => {
|
55 | console.time('list records');
|
56 | const result = await datasheet.records.query({ sort: [{ field: 'Title', order: 'desc' }] });
|
57 | console.timeEnd('list records');
|
58 | if (!result.success) {
|
59 | console.error(result);
|
60 | }
|
61 | expect(result.success).toBeTruthy();
|
62 | records = result.data!.records;
|
63 | });
|
64 |
|
65 | it('delete records', async () => {
|
66 | console.time('delete records');
|
67 | const result = await datasheet.records.delete(records.slice(0, 10).map(record => record.recordId));
|
68 | console.timeEnd('delete records');
|
69 |
|
70 | expect(result.success).toBeTruthy();
|
71 | });
|
72 |
|
73 | it('add records', async () => {
|
74 | const recordsToAdd = [{
|
75 | fields: {
|
76 | 'Title': 'One new row of records' + (new Date).toString(),
|
77 | }
|
78 | }];
|
79 |
|
80 | console.time('add records');
|
81 | const result = await datasheet.records.create(recordsToAdd);
|
82 | console.timeEnd('add records');
|
83 | if (!result.success) {
|
84 | console.error(result);
|
85 | }
|
86 | expect(result.success).toBeTruthy();
|
87 | records = result.data!.records;
|
88 | expect(result.data!.records.length).toEqual(recordsToAdd.length);
|
89 | });
|
90 |
|
91 | it('update records', async () => {
|
92 | const recordsToUpdate: IRecord[] = [{
|
93 | recordId: records[0].recordId,
|
94 | fields: {
|
95 | 'Title': 'A row of modified records' + (new Date).toString(),
|
96 | }
|
97 | }];
|
98 |
|
99 | console.time('update records');
|
100 | const result = await datasheet.records.update(recordsToUpdate);
|
101 | console.timeEnd('update records');
|
102 |
|
103 | expect(result.success).toBeTruthy();
|
104 | expect(result.data!.records.length).toEqual(recordsToUpdate.length);
|
105 |
|
106 |
|
107 |
|
108 | });
|
109 |
|
110 | it('upload buffer attachment', async () => {
|
111 | const buf = Buffer.from('hello world', 'utf8');
|
112 | console.time('upload attachment');
|
113 | const result = await datasheet.upload(buf, { filename: 'text.txt' });
|
114 | if (!result.success) {
|
115 | console.error(result);
|
116 | }
|
117 | console.timeEnd('upload attachment');
|
118 | expect(result.success).toBeTruthy();
|
119 | });
|
120 |
|
121 | it('upload attachment', async () => {
|
122 | const file = fs.createReadStream(path.join(__dirname, '../tsconfig.json'));
|
123 | console.time('upload attachment');
|
124 | const result = await datasheet.upload(file);
|
125 | if (!result.success) {
|
126 | console.error(result);
|
127 | }
|
128 | console.timeEnd('upload attachment');
|
129 | expect(result.success).toBeTruthy();
|
130 | });
|
131 |
|
132 | it('get space list', async () => {
|
133 | const result = await apitable.spaces.list();
|
134 | expect(result.success).toBeTruthy();
|
135 | spaceIds = result.data!.spaces.map(item => item.id);
|
136 | });
|
137 |
|
138 | it('get node list', async () => {
|
139 | const result = await apitable.nodes.list({ spaceId: spaceIds[0] });
|
140 | expect(result.success).toBeTruthy();
|
141 | nodes = result.data!.nodes;
|
142 | });
|
143 |
|
144 | it('get node detail', async () => {
|
145 | const firstNode = nodes[0];
|
146 | const result = await apitable.nodes.get({ spaceId: spaceIds[0], nodeId: firstNode.id });
|
147 | expect(result.success).toBeTruthy();
|
148 | expect(result.data?.id).toEqual(firstNode.id);
|
149 | });
|
150 |
|
151 | it('search node', async () => {
|
152 | const firstNode = nodes[0];
|
153 | const result = await apitable.nodes.search({ spaceId: spaceIds[0], type: firstNode.type, query: firstNode.name });
|
154 | expect(result.success).toBeTruthy();
|
155 | });
|
156 |
|
157 | it('create datasheet', async () => {
|
158 | const ro: IDatasheetCreateRo = {
|
159 | name: 'New single test form.',
|
160 | folderId
|
161 | };
|
162 | const res = await apitable.space(spaceId).datasheets.create(ro);
|
163 | expect({ success: res.success, message: res.message }).toBeTruthy();
|
164 | createdDatasheetId = res.data?.id||'';
|
165 | });
|
166 |
|
167 | it('create field', async () => {
|
168 | const property: IAddOpenSingleTextFieldProperty = {
|
169 | defaultValue: 'I am the default value.'
|
170 | };
|
171 | const ro: IDatasheetFieldCreateRo = {
|
172 | name: 'New text field.',
|
173 | type: 'SingleText',
|
174 | property
|
175 | };
|
176 | const res = await apitable.space(spaceId).datasheet(createdDatasheetId).fields.create(ro);
|
177 | expect(res.success).toBeTruthy();
|
178 | expect(res.data?.id).toBeDefined();
|
179 | createdFieldId = res.data?.id||'';
|
180 | });
|
181 |
|
182 | it('delete field', async () => {
|
183 | const res = await apitable.space(spaceId).datasheet(createdDatasheetId).fields.delete(createdFieldId);
|
184 | expect(res.success).toBeTruthy();
|
185 | });
|
186 |
|
187 | let embedId: string;
|
188 |
|
189 | it('create embed link', async() => {
|
190 | const embedLinkCreateRo = {
|
191 | "paylod": {
|
192 | "primarySideBar": { "collapsed": false },
|
193 | "viewControl": {
|
194 | "viewId": viewId,
|
195 | "tabBar": false,
|
196 | "toolBar": {
|
197 | "basicTools": false,
|
198 | "shareBtn": false,
|
199 | "widgetBtn": false,
|
200 | "apiBtn": false,
|
201 | "formBtn": false,
|
202 | "historyBtn": false,
|
203 | "robotBtn": false,
|
204 | },
|
205 | "collapsed": false,
|
206 | },
|
207 | "bannerLogo": true,
|
208 | "permissionType": PermissionType.READONLY,
|
209 | },
|
210 | "theme": EmbedLinkTheme.Light,
|
211 | };
|
212 | const res = await apitable.space(spaceId).datasheet(datasheetId).createEmbedLink(embedLinkCreateRo);
|
213 | expect(res.success).toBeTruthy();
|
214 | embedId = res.data?.linkId || '';
|
215 | })
|
216 |
|
217 | it('get embed links', async() => {
|
218 | const res = await apitable.space(spaceId).datasheet(datasheetId).getEmbedLinks();
|
219 | const embedsLinks = res.data || []
|
220 | expect(embedsLinks.some(v => v.linkId === embedId)).toBeTruthy();
|
221 | })
|
222 |
|
223 | it('delete embed link', async() => {
|
224 | jest.advanceTimersByTime(100);
|
225 | const res = await apitable.space(spaceId).datasheet(datasheetId).deleteEmbedLink(embedId);
|
226 | expect(res.success).toBeTruthy();
|
227 | })
|
228 |
|
229 | });
|