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', () => { |
|||
it('it should have logo text', async () => { |
|||
const page = Nightmare().goto('http://localhost:8000'); |
|||
const text = await page.wait('h1').evaluate(() => document.body.innerHTML).end(); |
|||
const browser = await puppeteer.launch(); |
|||
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>'); |
|||
await page.close(); |
|||
browser.close(); |
|||
}); |
|||
}); |
|||
|
|||
@ -1,32 +1,36 @@ |
|||
import Nightmare from 'nightmare'; |
|||
import puppeteer from 'puppeteer'; |
|||
|
|||
describe('Login', () => { |
|||
let browser; |
|||
let page; |
|||
beforeEach(() => { |
|||
page = Nightmare(); |
|||
page |
|||
.goto('http://localhost:8000/') |
|||
.evaluate(() => { |
|||
window.localStorage.setItem('antd-pro-authority', 'guest'); |
|||
}) |
|||
.goto('http://localhost:8000/#/user/login'); |
|||
|
|||
beforeAll(async () => { |
|||
browser = await puppeteer.launch(); |
|||
}); |
|||
|
|||
beforeEach(async () => { |
|||
page = await browser.newPage(); |
|||
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 () => { |
|||
await page.type('#userName', 'mockuser') |
|||
.type('#password', 'wrong_password') |
|||
.click('button[type="submit"]') |
|||
.wait('.ant-alert-error') // should display error
|
|||
.end(); |
|||
await page.type('#userName', 'mockuser'); |
|||
await page.type('#password', 'wrong_password'); |
|||
await page.click('button[type="submit"]'); |
|||
await page.waitForSelector('.ant-alert-error'); // should display error
|
|||
}); |
|||
|
|||
it('should login successfully', async () => { |
|||
const text = await page.type('#userName', 'admin') |
|||
.type('#password', '888888') |
|||
.click('button[type="submit"]') |
|||
.wait('.ant-layout-sider h1') // should display error
|
|||
.evaluate(() => document.body.innerHTML) |
|||
.end(); |
|||
await page.type('#userName', 'admin'); |
|||
await page.type('#password', '888888'); |
|||
await page.click('button[type="submit"]'); |
|||
await page.waitForSelector('.ant-layout-sider h1'); // should display error
|
|||
const text = await page.evaluate(() => document.body.innerHTML); |
|||
expect(text).toContain('<h1>Ant Design Pro</h1>'); |
|||
}); |
|||
|
|||
afterAll(() => browser.close()); |
|||
}); |
|||
|
|||
Loading…
Reference in new issue