10 changed files with 103 additions and 52 deletions
@ -0,0 +1,47 @@ |
|||||
|
--- |
||||
|
title: Login |
||||
|
cols: 1 |
||||
|
order: 15 |
||||
|
--- |
||||
|
|
||||
|
Support multiple common ways of login with built-in controls. You can choose your own combinations and use with your custom controls. |
||||
|
|
||||
|
## API |
||||
|
|
||||
|
### Login |
||||
|
|
||||
|
Property | Description | Type | Default |
||||
|
----|------|-----|------ |
||||
|
defaultActiveKey | default key to activate the tab panel | String | - |
||||
|
onTabChange | callback on changing tabs | (key) => void | - |
||||
|
onSubmit | callback on submit | (err, values) => void | - |
||||
|
|
||||
|
### Login.Tab |
||||
|
|
||||
|
Property | Description | Type | Default |
||||
|
----|------|-----|------ |
||||
|
key | key of the tab | String | - |
||||
|
tab | displayed text of the tab | ReactNode | - |
||||
|
|
||||
|
### Login.UserName |
||||
|
|
||||
|
Property | Description | Type | Default |
||||
|
----|------|-----|------ |
||||
|
name | name of the control, also the key of the submitted data | String | - |
||||
|
rules | validation rules, same with [option.rules](getFieldDecorator(id, options)) in Form getFieldDecorator(id, options) | object[] | - |
||||
|
|
||||
|
Apart from the above properties, Login.Username also support all properties of antd.Input, together with the default values of basic settings, such as _placeholder_, _size_ and _prefix_. All of these default values can be over-written. |
||||
|
|
||||
|
### Login.Password, Login.Mobile are the same as Login.UserName |
||||
|
|
||||
|
### Login.Captcha |
||||
|
|
||||
|
Property | Description | Type | Default |
||||
|
----|------|-----|------ |
||||
|
onGetCaptcha | callback on getting a new Captcha | () => void | - |
||||
|
|
||||
|
Apart from the above properties, _Login.Captcha_ support the same properties with _Login.UserName_. |
||||
|
|
||||
|
### Login.Submit |
||||
|
|
||||
|
Support all properties of _antd.Button_. |
||||
@ -1,9 +1,14 @@ |
|||||
import Nightmare from 'nightmare'; |
import puppeteer from 'puppeteer'; |
||||
|
|
||||
describe('Homepage', () => { |
describe('Homepage', () => { |
||||
it('it should have logo text', async () => { |
it('it should have logo text', async () => { |
||||
const page = Nightmare().goto('http://localhost:8000'); |
const browser = await puppeteer.launch(); |
||||
const text = await page.wait('h1').evaluate(() => document.body.innerHTML).end(); |
const page = await browser.newPage(); |
||||
|
await page.goto('http://localhost:8000'); |
||||
|
await page.waitForSelector('h1'); |
||||
|
const text = await page.evaluate(() => document.body.innerHTML); |
||||
expect(text).toContain('<h1>Ant Design Pro</h1>'); |
expect(text).toContain('<h1>Ant Design Pro</h1>'); |
||||
|
await page.close(); |
||||
|
browser.close(); |
||||
}); |
}); |
||||
}); |
}); |
||||
|
|||||
@ -1,32 +1,36 @@ |
|||||
import Nightmare from 'nightmare'; |
import puppeteer from 'puppeteer'; |
||||
|
|
||||
describe('Login', () => { |
describe('Login', () => { |
||||
|
let browser; |
||||
let page; |
let page; |
||||
beforeEach(() => { |
|
||||
page = Nightmare(); |
beforeAll(async () => { |
||||
page |
browser = await puppeteer.launch(); |
||||
.goto('http://localhost:8000/') |
}); |
||||
.evaluate(() => { |
|
||||
window.localStorage.setItem('antd-pro-authority', 'guest'); |
beforeEach(async () => { |
||||
}) |
page = await browser.newPage(); |
||||
.goto('http://localhost:8000/#/user/login'); |
await page.goto('http://localhost:8000/#/user/login'); |
||||
|
await page.evaluate(() => window.localStorage.setItem('antd-pro-authority', 'guest')); |
||||
}); |
}); |
||||
|
|
||||
|
afterEach(() => page.close()); |
||||
|
|
||||
it('should login with failure', async () => { |
it('should login with failure', async () => { |
||||
await page.type('#userName', 'mockuser') |
await page.type('#userName', 'mockuser'); |
||||
.type('#password', 'wrong_password') |
await page.type('#password', 'wrong_password'); |
||||
.click('button[type="submit"]') |
await page.click('button[type="submit"]'); |
||||
.wait('.ant-alert-error') // should display error
|
await page.waitForSelector('.ant-alert-error'); // should display error
|
||||
.end(); |
|
||||
}); |
}); |
||||
|
|
||||
it('should login successfully', async () => { |
it('should login successfully', async () => { |
||||
const text = await page.type('#userName', 'admin') |
await page.type('#userName', 'admin'); |
||||
.type('#password', '888888') |
await page.type('#password', '888888'); |
||||
.click('button[type="submit"]') |
await page.click('button[type="submit"]'); |
||||
.wait('.ant-layout-sider h1') // should display error
|
await page.waitForSelector('.ant-layout-sider h1'); // should display error
|
||||
.evaluate(() => document.body.innerHTML) |
const text = await page.evaluate(() => document.body.innerHTML); |
||||
.end(); |
|
||||
expect(text).toContain('<h1>Ant Design Pro</h1>'); |
expect(text).toContain('<h1>Ant Design Pro</h1>'); |
||||
}); |
}); |
||||
|
|
||||
|
afterAll(() => browser.close()); |
||||
}); |
}); |
||||
|
|||||
Loading…
Reference in new issue