mirror of
https://github.com/nocodb/nocodb.git
synced 2026-05-01 05:56:41 +00:00
* feat: Improved ui (#6156) * refactor: revert Signed-off-by: Pranav C <pranavxc@gmail.com> feat: shared base Signed-off-by: Pranav C <pranavxc@gmail.com> fix: remove duplicate import statement Signed-off-by: Pranav C <pranavxc@gmail.com> fix: disable starred & license menu Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> test: fix airtable wait issue Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> test: enable mysql in ci Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> test: fix checkbox order for sqlite Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> test: disable quick tests Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> test: fix dbType env variable for CI Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> test: workspace API access error fix Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> test: enable SQLite CI CD Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> test: use DB_TYPE env variable Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> test: enable SQLite UT Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> test: isHub cleanup Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> test: add check for EE Timezone spec Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> chore: cleanup Signed-off-by: Pranav C <pranavxc@gmail.com> chore: cleanup Signed-off-by: Pranav C <pranavxc@gmail.com> test: EE check fix Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> chore: test correction Signed-off-by: Pranav C <pranavxc@gmail.com> chore: sync latest changes Signed-off-by: Pranav C <pranavxc@gmail.com> test: set EE=false Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> test: set NC Edition to community in workflow file Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> chore: update sdk build command Signed-off-by: Pranav C <pranavxc@gmail.com> refactor: i18n and other changes Signed-off-by: Pranav C <pranavxc@gmail.com> feat: new ui Signed-off-by: Pranav C <pranavxc@gmail.com> * chore: sync tests Signed-off-by: Pranav C <pranavxc@gmail.com> * chore: lint Signed-off-by: Pranav C <pranavxc@gmail.com> * fix: shared view/base related bugs Signed-off-by: Pranav C <pranavxc@gmail.com> * test: checkbox verification sort order fix Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> * test: fix sqlite reset Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> * test: enable selfhosted runners Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> * docs: table ops (draft) Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> * Docs: screenshots for table-operations.md * refactor: introduce missing buttons Signed-off-by: Pranav C <pranavxc@gmail.com> * fix: get all fields Signed-off-by: Pranav C <pranavxc@gmail.com> * test: UT fix- new data API response Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> * test: EE is false Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> * test: webhook lookup as string in CE Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> * fix: include created_at and updated_at Signed-off-by: Pranav C <pranavxc@gmail.com> * test: fix UT newDataAPI response for PG Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> * fix: separate api for webhook related plugins Signed-off-by: Pranav C <pranavxc@gmail.com> * test: msyql filter corrections Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> * test: mysql group by test corrections Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> * test: fix datatype for rating field in groupby spec for pg Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> * test: kanban datatype correction Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> * test: column edit for mysql- rating field Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> * test: misc fixes Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> * test: enable 4 workers Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> * test: enable 2 workers per shard only Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> * docs: table CRUD * Rename table-operations.md to table-crud.md * Create column-crud.md * docs: row CRUD * Rename row.md to row-crud.md * docs: project crud * docs: toolbar (skeleton) * refactor: single page UI and bug fixes Signed-off-by: Pranav C <pranavxc@gmail.com> * chore: sync tests playwright Signed-off-by: Pranav C <pranavxc@gmail.com> * chore: add missing dependency Signed-off-by: Pranav C <pranavxc@gmail.com> * feat: single page ui, test corrections Signed-off-by: Pranav C <pranavxc@gmail.com> * chore: tests Signed-off-by: Pranav C <pranavxc@gmail.com> * test: project rename test correction Signed-off-by: Pranav C <pranavxc@gmail.com> * chore: remove only Signed-off-by: Pranav C <pranavxc@gmail.com> * test: remove wrong import statement Signed-off-by: Pranav C <pranavxc@gmail.com> * fix: delete option not visible in project context menu Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> * test: move ws access within isEE() Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> * test: fix groupby * test: groupby fix Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> * docs: signup & landing page * docs: project crud * docs: project-crud misc * docs: toolbar fields * docs: toolbar / filters * docs: toolbar / group by * docs: toolbar / sort * docs: toolbar / row height * docs: filters additional options * docs: file re-order Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> * docs: add links to column types * docs: code snippets * docs: links * docs: lookup * docs: rollup * docs: formula * docs: primary key * docs: display value * docs: development setup * docs: swagger * fix(nc-gui): encodeURIComponent for row id - closes: #6202 * docs: language * docs: expanded record * docs: import airtable * docs: airtable * docs: webhook * docs: revert file rename Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> * docs: account settings * docs: audit * docs: meta management * docs: project settings * docs: shared base * docs: shared view * docs: meta sync * docs: team-auth * docs: views * docs: fix URL * docs: URL corrections * fix: shared base, view related bugs Signed-off-by: Pranav C <pranavxc@gmail.com> * test: EE check for WSaccess Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> * test: exclude EE tests Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> * fix: missing project delete closes #6215 Signed-off-by: Pranav C <pranavxc@gmail.com> * fix: merge existing project meta if found closes #6216 Signed-off-by: Pranav C <pranavxc@gmail.com> * fix: merge existing project meta if found closes #6216 Signed-off-by: Pranav C <pranavxc@gmail.com> --------- Signed-off-by: Pranav C <pranavxc@gmail.com> Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> Co-authored-by: Raju Udava <86527202+dstala@users.noreply.github.com> Co-authored-by: DarkPhoenix2704 <anbarasun123@gmail.com> Co-authored-by: Wing-Kam Wong <wingkwong.code@gmail.com> * refactor: docs and other bug fixes Signed-off-by: Pranav C <pranavxc@gmail.com> * feat: populate default project on super admin signup Signed-off-by: Pranav C <pranavxc@gmail.com> * fix: include created project details in signup response if avail, missing Dockerfile Signed-off-by: Pranav C <pranavxc@gmail.com> * chore: use custom function for resolving ts path aliases Signed-off-by: Pranav C <pranavxc@gmail.com> * chore: add missing generate script Signed-off-by: Pranav C <pranavxc@gmail.com> * chore: webpack build correction - ts path resolve Signed-off-by: Pranav C <pranavxc@gmail.com> --------- Signed-off-by: Pranav C <pranavxc@gmail.com> Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> Co-authored-by: mertmit <mertmit99@gmail.com> Co-authored-by: Raju Udava <86527202+dstala@users.noreply.github.com> Co-authored-by: DarkPhoenix2704 <anbarasun123@gmail.com> Co-authored-by: Wing-Kam Wong <wingkwong.code@gmail.com>
192 lines
5.5 KiB
Markdown
192 lines
5.5 KiB
Markdown
---
|
|
title: "Writing Unit Tests"
|
|
description: "Overview to Unit Testing"
|
|
---
|
|
|
|
## Unit Tests
|
|
|
|
- All individual unit tests are independent of each other. We don't use any shared state between tests.
|
|
- Test environment includes `sakila` sample database and any change to it by a test is reverted before running other tests.
|
|
- While running unit tests, it tries to connect to mysql server running on `localhost:3306` with username `root` and password `password` (which can be configured) and if not found, it will use `sqlite` as a fallback, hence no requirement of any sql server to run tests.
|
|
|
|
### Pre-requisites
|
|
|
|
- MySQL is preferred - however tests can fallback on SQLite too
|
|
|
|
### Setup
|
|
|
|
```bash
|
|
cd packages/nocodb
|
|
|
|
npm install
|
|
|
|
# add a .env file
|
|
cp tests/unit/.env.sample tests/unit/.env
|
|
|
|
# open .env file
|
|
open tests/unit/.env
|
|
```
|
|
|
|
Configure the following variables
|
|
> DB_HOST : host
|
|
> DB_PORT : port
|
|
> DB_USER : username
|
|
> DB_PASSWORD : password
|
|
|
|
### Run Tests
|
|
|
|
``` bash
|
|
npm run test:unit
|
|
```
|
|
|
|
### Folder Structure
|
|
|
|
The root folder for unit tests is `packages/nocodb/tests/unit`
|
|
|
|
- `rest` folder contains all the test suites for rest apis.
|
|
- `model` folder contains all the test suites for models.
|
|
- `factory` folder contains all the helper functions to create test data.
|
|
- `init` folder contains helper functions to configure test environment.
|
|
- `index.test.ts` is the root test suite file which imports all the test suites.
|
|
- `TestDbMngr.ts` is a helper class to manage test databases (i.e. creating, dropping, etc.).
|
|
|
|
### Factory Pattern
|
|
|
|
- Use factories for create/update/delete data. No data should be directly create/updated/deleted in the test.
|
|
- While writing a factory make sure that it can be used with as less parameters as possible and use default values for other parameters.
|
|
- Use named parameters for factories.
|
|
```ts
|
|
createUser({ email, password})
|
|
```
|
|
- Use one file per factory.
|
|
|
|
|
|
### Walk through of writing a Unit Test
|
|
|
|
We will create an `Table` test suite as an example.
|
|
|
|
#### Configure test
|
|
|
|
We will configure `beforeEach` which is called before each test is executed. We will use `init` function from `nocodb/packages/nocodb/tests/unit/init/index.ts`, which is a helper function which configures the test environment(i.e resetting state, etc.).
|
|
|
|
`init` does the following things -
|
|
|
|
- It initializes a `Noco` instance(reused in all tests).
|
|
- Restores `meta` and `sakila` database to its initial state.
|
|
- Creates the root user.
|
|
- Returns `context` which has `auth token` for the created user, node server instance(`app`), and `dbConfig`.
|
|
|
|
We will use `createProject` and `createProject` factories to create a project and a table.
|
|
|
|
```typescript
|
|
let context;
|
|
|
|
beforeEach(async function () {
|
|
context = await init();
|
|
|
|
project = await createProject(context);
|
|
table = await createTable(context, project);
|
|
});
|
|
```
|
|
|
|
#### Test case
|
|
|
|
We will use `it` function to create a test case. We will use `supertest` to make a request to the server. We use `expect`(`chai`) to assert the response.
|
|
|
|
```typescript
|
|
it('Get table list', async function () {
|
|
const response = await request(context.app)
|
|
.get(`/api/v1/db/meta/projects/${project.id}/tables`)
|
|
.set('xc-auth', context.token)
|
|
.send({})
|
|
.expect(200);
|
|
|
|
expect(response.body.list).to.be.an('array').not.empty;
|
|
});
|
|
```
|
|
|
|
:::note
|
|
|
|
We can also run individual test by using `.only` in `describe` or `it` function and the running the test command.
|
|
|
|
:::
|
|
|
|
```typescript
|
|
it.only('Get table list', async () => {
|
|
```
|
|
|
|
#### Integrating the New Test Suite
|
|
|
|
We create a new file `table.test.ts` in `packages/nocodb/tests/unit/rest/tests` directory.
|
|
|
|
```typescript
|
|
import 'mocha';
|
|
import request from 'supertest';
|
|
import init from '../../init';
|
|
import { createTable, getAllTables } from '../../factory/table';
|
|
import { createProject } from '../../factory/project';
|
|
import { defaultColumns } from '../../factory/column';
|
|
import Model from '../../../../src/lib/models/Model';
|
|
import { expect } from 'chai';
|
|
|
|
function tableTest() {
|
|
let context;
|
|
let project;
|
|
let table;
|
|
|
|
beforeEach(async function () {
|
|
context = await init();
|
|
|
|
project = await createProject(context);
|
|
table = await createTable(context, project);
|
|
});
|
|
|
|
it('Get table list', async function () {
|
|
const response = await request(context.app)
|
|
.get(`/api/v1/db/meta/projects/${project.id}/tables`)
|
|
.set('xc-auth', context.token)
|
|
.send({})
|
|
.expect(200);
|
|
|
|
expect(response.body.list).to.be.an('array').not.empty;
|
|
});
|
|
}
|
|
|
|
export default function () {
|
|
describe('Table', tableTests);
|
|
}
|
|
```
|
|
|
|
We can then import the `Table` test suite to `Rest` test suite in `packages/nocodb/tests/unit/rest/index.test.ts` file(`Rest` test suite is imported in the root test suite file which is `packages/nocodb/tests/unit/index.test.ts`).
|
|
|
|
### Seeding Sample DB (Sakila)
|
|
|
|
```typescript
|
|
|
|
function tableTest() {
|
|
let context;
|
|
let sakilaProject: Project;
|
|
let customerTable: Model;
|
|
|
|
beforeEach(async function () {
|
|
context = await init();
|
|
|
|
/******* Start : Seeding sample database **********/
|
|
sakilaProject = await createSakilaProject(context);
|
|
/******* End : Seeding sample database **********/
|
|
|
|
customerTable = await getTable({project: sakilaProject, name: 'customer'})
|
|
});
|
|
|
|
it('Get table data list', async function () {
|
|
const response = await request(context.app)
|
|
.get(`/api/v1/db/data/noco/${sakilaProject.id}/${customerTable.id}`)
|
|
.set('xc-auth', context.token)
|
|
.send({})
|
|
.expect(200);
|
|
|
|
expect(response.body.list[0]['FirstName']).to.equal('MARY');
|
|
});
|
|
}
|
|
```
|