UNPKG

7.46 kBPlain TextView Raw
1import env from 'dotenv';
2import fs from 'fs';
3import { Buffer } from 'buffer';
4import path from 'path';
5import { Vika } from '../lib';
6import { IDatasheetCreateRo, INodeItem, IRecord } from '../lib/interface';
7import { IDatasheetFieldCreateRo } from '../lib/interface/datasheet.field.create.ro';
8import { PermissionType, EmbedLinkTheme } from '../lib/interface/embed.link';
9import { IAddOpenSingleTextFieldProperty } from '../lib/interface/field.create.property';
10
11env.config();
12
13jest.setTimeout(30000);
14
15describe('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 // Read the initial.
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 // const all = await datasheet.records.query();
106 // The length should be the same as the original datasheet.
107 // expect(all.data!.records.length).toEqual(records.length);
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 // spaces list
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 // nodes list
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 // node detail
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 // nodes search
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});