* Set the value if set is available * tests: add failing e2e test case * use Object.assign to always ensure setState receives a new value objectbubble
@@ -33,7 +33,8 @@ export default class HttpAuth extends React.Component { | |||||
let { onChange } = this.props | let { onChange } = this.props | ||||
let { value, name } = e.target | let { value, name } = e.target | ||||
let newValue = this.state.value || {} | |||||
let newValue = Object.assign({}, this.state.value) | |||||
if(name) { | if(name) { | ||||
newValue[name] = value | newValue[name] = value | ||||
} else { | } else { | ||||
@@ -0,0 +1,44 @@ | |||||
describe("bug #4196: HTTP basic auth credential retention", function () { | |||||
let mainPage | |||||
beforeEach(function (client, done) { | |||||
mainPage = client | |||||
.url("localhost:3230") | |||||
.page.main() | |||||
client.waitForElementVisible(".download-url-input", 5000) | |||||
.pause(80) | |||||
.clearValue(".download-url-input") | |||||
.setValue(".download-url-input", "http://localhost:3230/test-specs/bugs/4196.yaml") | |||||
.click("button.download-url-button") | |||||
.pause(1000) | |||||
done() | |||||
}) | |||||
afterEach(function (client, done) { | |||||
done() | |||||
}) | |||||
it("should display the most recent auth data across modal close/opens", function (client) { | |||||
client.waitForElementVisible(".opblock-tag-section", 10000) | |||||
.click("button.btn.authorize") // Open modal | |||||
.waitForElementVisible("section>input", 5000) | |||||
.setValue("section>input", "aaa") // Set user | |||||
.waitForElementVisible(`section>input[type="password"]`, 5000) | |||||
.setValue(`section>input[type="password"]`, "aaa") // Set password | |||||
.click(".auth-btn-wrapper button:nth-child(1)") // Click Authorize | |||||
.assert.containsText("div.wrapper:nth-child(4)>code", "aaa") | |||||
.click(".auth-btn-wrapper button:nth-child(2)") // Close modal | |||||
.pause(50) | |||||
.click("button.btn.authorize") // Open modal | |||||
.pause(50) | |||||
.click(".auth-btn-wrapper button:nth-child(1)") // Logout | |||||
.waitForElementVisible("section>input", 5000) | |||||
.setValue("section>input", "bbb") // Set user | |||||
.waitForElementVisible(`section>input[type="password"]`, 5000) | |||||
.setValue(`section>input[type="password"]`, "bbb") // Set password | |||||
.click(".auth-btn-wrapper button:nth-child(1)") // Click Authorize | |||||
.pause(5000) | |||||
.assert.containsText("div.wrapper:nth-child(4)>code", "bbb") | |||||
client.end() | |||||
}) | |||||
}) |
@@ -0,0 +1,85 @@ | |||||
openapi: 3.0.0 | |||||
info: | |||||
title: Demo API | |||||
description: First test | |||||
termsOfService: 'http://demo.io/terms-of-service/' | |||||
contact: | |||||
name: Demo Support | |||||
email: support@demo.io | |||||
version: 1.0.0 | |||||
servers: | |||||
- url: '{server}/v1' | |||||
variables: | |||||
server: | |||||
default: https://api.demo.io | |||||
description: the API endpoint | |||||
paths: | |||||
/session: | |||||
put: | |||||
summary: Returns a new authentication token | |||||
tags: | |||||
- session | |||||
security: | |||||
- basicAuth: [] | |||||
responses: | |||||
'201': | |||||
description: A session object | |||||
content: | |||||
application/json: | |||||
schema: | |||||
allOf: | |||||
- type: object | |||||
properties: | |||||
user_id: | |||||
type: string | |||||
format: uuid | |||||
readOnly: true | |||||
example: 110e8400-e29b-11d4-a716-446655440000 | |||||
- $ref: '#/components/schemas/Session' | |||||
'401': | |||||
$ref: '#/components/responses/Unauthorized' | |||||
components: | |||||
securitySchemes: | |||||
basicAuth: | |||||
type: http | |||||
scheme: basic | |||||
bearerAuth: | |||||
type: http | |||||
scheme: bearer | |||||
bearerFormat: JWT | |||||
schemas: | |||||
Session: | |||||
required: | |||||
- token | |||||
properties: | |||||
token: | |||||
type: string | |||||
readOnly: true | |||||
example: >- | |||||
eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.EkN-DOsnsuRjRO6BxXemmJDm3HbxrbRzXglbN2S4sOkopdU4IsDxTI8jO19W_A4K8ZPJijNLis4EZsHeY559a4DFOd50_OqgHGuERTqYZyuhtF39yxJPAjUESwxk2J5k_4zM3O-vtd1Ghyo4IbqKKSy6J9mTniYJPenn5-HIirE | |||||
Error: | |||||
required: | |||||
- message | |||||
properties: | |||||
message: | |||||
description: a human readable message explaining the error | |||||
type: string | |||||
reason: | |||||
description: a functionnal key about the error | |||||
type: string | |||||
responses: | |||||
Unauthorized: | |||||
description: Not authenticated | |||||
content: | |||||
application/json: | |||||
schema: | |||||
$ref: '#/components/schemas/Error' | |||||
Default: | |||||
description: unexpected error | |||||
content: | |||||
application/json: | |||||
schema: | |||||
$ref: '#/components/schemas/Error' |