canner
Version:
Build CMS in few lines of code for different data sources
153 lines (136 loc) • 5.31 kB
JavaScript
const puppeteer = require('puppeteer')
let browser;
let page;
jest.setTimeout(60000);
describe('on page load', () => {
beforeAll(async () => {
browser = await puppeteer.launch({
headless: false,
slowMo: 0
})
page = (await browser.pages())[0]
await page.goto('http://localhost:8080/demo/products');
await page.waitForSelector('div[data-testid="products"]');
// reset localStorage
await page.evaluate(() => { localStorage.clear(); });
await page.setViewport({
width: 900,
height: 800
})
});
afterAll(() => {
browser.close();
})
test('should render products with table', async () => {
const trLength = await page.$$eval('div[data-testid="products"] table tr', trs => trs.length);
// should be 10 products at least, and antd will render more tr for style reasons
expect(trLength).toBeGreaterThan(10);
});
test('should change route when click first edit button', async () => {
await clickAndWait(page, 'button[data-testid="edit-button"]');
await page.waitForSelector('div[data-testid="products/no"]'),
expect(page.url()).toBe('http://localhost:8080/demo/products/products1');
});
test('should navigate and remove changes after reset', async () => {
await goToProduct(page);
const previousValue = await getProduct1(page);
await updateProduct1(page, {
no: 'number',
name: 'name',
price: '1000',
promo: '800'
});
// click reset
await clickAndWait(page, 'button[data-testid="reset-button"]');
expect(page.url()).toBe('http://localhost:8080/demo/products');
// re-reneter products1
await goToProduct(page);
const productValue = await getProduct1(page);
expect(productValue).toMatchObject(previousValue)
});
test('should navigate and deploy changes after deplot', async () => {
await goToProduct(page);
const previousValue = await getProduct1(page);
await updateProduct1(page, {
no: 'number',
name: 'name',
price: '1000',
promo: '800'
});
// click reset
await clickAndWait(page, 'button[data-testid="confirm-button"]');
expect(page.url()).toBe('http://localhost:8080/demo/products');
// re-reneter products1
await goToProduct(page);
const productValue = await getProduct1(page);
expect(productValue).toMatchObject({
no: `${previousValue.no}number`,
name: `${previousValue.name}name`,
price: `${previousValue.price}1000`,
promo: `${previousValue.promo}800`
})
});
test('should delete item', async () => {
await goToProductList(page);
const originTrLength = await page.$$eval('div[data-testid="products"] table tr', trs => trs.length);
await deleteProduct(page);
const hasDeleted = await page.waitFor(trLength => {
return document.querySelectorAll('div[data-testid="products"] table tr').length < trLength;
}, {}, originTrLength);
expect(hasDeleted).toBeTruthy();
});
test('should create item', async () => {
await goToProductList(page);
await deleteProduct(page);
const originTrLength = await page.$$eval('div[data-testid="products"] table tr', trs => trs.length);
await clickAndWait(page, 'button[data-testid="add-button"]');
await page.waitForSelector('div[data-testid="products/no"]');
await updateProduct1(page, {
no: 'number',
name: 'name',
price: '1000',
promo: '800'
})
await clickAndWait(page, 'button[data-testid="confirm-button"]');
await page.waitForSelector('div[data-testid="products"]');
const hasCreated = await page.waitFor(trLength => {
return document.querySelectorAll('div[data-testid="products"] table tr').length > trLength;
}, {}, originTrLength);
expect(hasCreated).toBeTruthy();
});
})
async function getProduct1(page) {
return await page.evaluate(() => {
return {
no: document.querySelector('div[data-testid="products/no"] input').value,
name: document.querySelector('div[data-testid="products/name"] input').value,
price: document.querySelector('div[data-testid="products/price"] input').value,
promo: document.querySelector('div[data-testid="products/promo"] input').value,
}
});
}
async function updateProduct1(page, value) {
await page.type('div[data-testid="products/no"] input', value.no);
await page.type('div[data-testid="products/name"] input', value.name);
await page.type('div[data-testid="products/price"] input', value.price);
await page.type('div[data-testid="products/promo"] input', value.promo);
}
async function deleteProduct(page) {
page.click('button[data-testid="delete-button"]');
await page.waitForSelector('div.ant-popover-buttons');
await page.evaluate(() => document.querySelector('div.ant-popover-buttons button.ant-btn-danger').click())
}
async function clickAndWait(page, selector) {
return await Promise.all([
page.waitForNavigation(),
page.click(selector)
]);
}
async function goToProductList(page) {
await page.goto('http://localhost:8080/demo/products');
await page.waitForSelector('div[data-testid="products"]');
}
async function goToProduct(page) {
await page.goto('http://localhost:8080/demo/products/products1');
await page.waitForSelector('div[data-testid="products/no"]');
}