Skip to content

Commit

Permalink
Merge pull request #4450 from openshift-cherrypick-robot/cherry-pick-…
Browse files Browse the repository at this point in the history
…4428-to-release-4.4

[release-4.4] Bug 1806166: Fix incorrect IDP dry run requests
  • Loading branch information
openshift-merge-robot committed Feb 25, 2020
2 parents ed2ce44 + 163febd commit 562ef8b
Show file tree
Hide file tree
Showing 13 changed files with 301 additions and 22 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,8 @@ describe('Add Identity Provider: OpenID Connect', () => {
it('should render the form elements of AddOpenIDPage component', () => {
expect(wrapper.find(IDPNameInput).exists()).toBe(true);
expect(wrapper.find(IDPCAFileInput).exists()).toBe(true);
expect(wrapper.find('input[id="clientID"]').exists()).toBe(true);
expect(wrapper.find('input[id="clientSecret"]').exists()).toBe(true);
expect(wrapper.find('input[id="client-id"]').exists()).toBe(true);
expect(wrapper.find('input[id="client-secret"]').exists()).toBe(true);
expect(wrapper.find('input[id="issuer"]').exists()).toBe(true);
expect(wrapper.find(ListInput).length).toEqual(4);
});
Expand Down
3 changes: 3 additions & 0 deletions frontend/integration-tests/protractor.conf.ts
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ const testSuites = {
]),
overview: suite(['tests/overview/overview.scenario.ts']),
crdExtensions: suite(['tests/crd-extensions.scenario.ts']),
oauth: suite(['tests/oauth.scenario.ts']),
e2e: suite([
'tests/crud.scenario.ts',
'tests/filter.scenario.ts',
Expand All @@ -90,6 +91,7 @@ const testSuites = {
'tests/monitoring.scenario.ts',
'tests/alertmanager.scenario.ts',
'tests/crd-extensions.scenario.ts',
'tests/oauth.scenario.ts',
'tests/devconsole/pipeline.scenario.ts',
]),
release: suite([
Expand Down Expand Up @@ -120,6 +122,7 @@ const testSuites = {
'tests/devconsole/git-import-flow.scenario.ts',
'tests/devconsole/pipeline.scenario.ts',
'tests/crd-extensions.scenario.ts',
'tests/oauth.scenario.ts',
]),
clusterSettings: suite(['tests/cluster-settings.scenario.ts']),
alertmanager: suite(['tests/alertmanager.scenario.ts']),
Expand Down
220 changes: 220 additions & 0 deletions frontend/integration-tests/tests/oauth.scenario.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,220 @@
import { browser, ExpectedConditions as until } from 'protractor';
import { execSync } from 'child_process';

import { appHost, checkLogs, checkErrors, testName } from '../protractor.conf';
import * as crudView from '../views/crud.view';
import * as oauthView from '../views/oauth.view';

describe('OAuth', () => {
const oauthSettingsURL = `${appHost}/k8s/cluster/config.openshift.io~v1~OAuth/cluster`;
let originalOAuthConfig: any;
beforeAll(() => {
originalOAuthConfig = JSON.parse(execSync('kubectl get -o json oauths cluster').toString());
});

afterAll(() => {
const idpJSON = JSON.stringify(originalOAuthConfig.spec.identityProviders);
execSync(
`kubectl patch oauths cluster --type json -p='[{ op: 'replace', path: '/spec/identityProviders', value: ${idpJSON}}]'`,
);
});

afterEach(() => {
checkLogs();
checkErrors();
});

// TODO: Add tests for HTPasswd and Request Header identity providers.
// These IDPs require file upload.

describe('BasicAuth IDP', () => {
const idpName = `basic-auth-${testName}`;
it('creates a Basic Authentication IDP', async () => {
await browser.get(oauthSettingsURL);
await browser.wait(until.elementToBeClickable(oauthView.addIDPDropdown));
await oauthView.addIDPDropdown.click();
await browser.wait(until.elementToBeClickable(oauthView.basicAuthLink));
await oauthView.basicAuthLink.click();
await browser.wait(until.elementToBeClickable(oauthView.idpNameInput));
await oauthView.idpNameInput.clear();
await oauthView.idpNameInput.sendKeys(idpName);
await oauthView.basicAuthURLInput.sendKeys('https://example.com');
await oauthView.addIDPButton.click();
expect(oauthView.errorMessage.isPresent()).toBe(false);
});

it('shows the BasicAuth IDP on the OAuth settings page', async () => {
await browser.wait(until.presenceOf(crudView.resourceTitle));
expect(browser.getCurrentUrl()).toContain('config.openshift.io~v1~OAuth/cluster');
await crudView.isLoaded();
expect(oauthView.idpTableCellName(idpName).getText()).toEqual(idpName);
expect(oauthView.idpTableCellType(idpName).getText()).toEqual('BasicAuth');
expect(oauthView.idpTableCellMapping(idpName).getText()).toEqual('claim');
});
});

describe('GitHub IDP', () => {
const idpName = `github-${testName}`;
it('creates a GitHub IDP', async () => {
await browser.get(oauthSettingsURL);
await browser.wait(until.elementToBeClickable(oauthView.addIDPDropdown));
await oauthView.addIDPDropdown.click();
await browser.wait(until.elementToBeClickable(oauthView.githubLink));
await oauthView.githubLink.click();
await browser.wait(until.elementToBeClickable(oauthView.idpNameInput));
await oauthView.idpNameInput.clear();
await oauthView.idpNameInput.sendKeys(idpName);
await oauthView.githubClientIDInput.sendKeys('my-client-id');
await oauthView.githubClientSecretInput.sendKeys('my-client-secret');
await oauthView.githubOrganizationInput.sendKeys('my-organization');
await oauthView.addIDPButton.click();
expect(oauthView.errorMessage.isPresent()).toBe(false);
});

it('shows the GitHub IDP on the OAuth settings page', async () => {
await browser.wait(until.presenceOf(crudView.resourceTitle));
expect(browser.getCurrentUrl()).toContain('config.openshift.io~v1~OAuth/cluster');
await crudView.isLoaded();
expect(oauthView.idpTableCellName(idpName).getText()).toEqual(idpName);
expect(oauthView.idpTableCellType(idpName).getText()).toEqual('GitHub');
expect(oauthView.idpTableCellMapping(idpName).getText()).toEqual('claim');
});
});

describe('GitLab IDP', () => {
const idpName = `gitlab-${testName}`;
it('creates a GitLab IDP', async () => {
await browser.get(oauthSettingsURL);
await browser.wait(until.elementToBeClickable(oauthView.addIDPDropdown));
await oauthView.addIDPDropdown.click();
await browser.wait(until.elementToBeClickable(oauthView.gitlabLink));
await oauthView.gitlabLink.click();
await browser.wait(until.elementToBeClickable(oauthView.idpNameInput));
await oauthView.idpNameInput.clear();
await oauthView.idpNameInput.sendKeys(idpName);
await oauthView.gitlabURLInput.sendKeys('https://example.com');
await oauthView.gitlabClientIDInput.sendKeys('my-client-id');
await oauthView.gitlabClientSecretInput.sendKeys('my-client-secret');
await oauthView.addIDPButton.click();
expect(oauthView.errorMessage.isPresent()).toBe(false);
});

it('shows the GitLab IDP on the OAuth settings page', async () => {
await browser.wait(until.presenceOf(crudView.resourceTitle));
expect(browser.getCurrentUrl()).toContain('config.openshift.io~v1~OAuth/cluster');
await crudView.isLoaded();
expect(oauthView.idpTableCellName(idpName).getText()).toEqual(idpName);
expect(oauthView.idpTableCellType(idpName).getText()).toEqual('GitLab');
expect(oauthView.idpTableCellMapping(idpName).getText()).toEqual('claim');
});
});

describe('Google IDP', () => {
const idpName = `google-${testName}`;
it('creates a Google IDP', async () => {
await browser.get(oauthSettingsURL);
await browser.wait(until.elementToBeClickable(oauthView.addIDPDropdown));
await oauthView.addIDPDropdown.click();
await browser.wait(until.elementToBeClickable(oauthView.googleLink));
await oauthView.googleLink.click();
await browser.wait(until.elementToBeClickable(oauthView.idpNameInput));
await oauthView.idpNameInput.clear();
await oauthView.idpNameInput.sendKeys(idpName);
await oauthView.googleClientIDInput.sendKeys('my-client-id');
await oauthView.googleClientSecretInput.sendKeys('my-client-secret');
await oauthView.googleHostedDomainInput.sendKeys('example.com');
await oauthView.addIDPButton.click();
expect(oauthView.errorMessage.isPresent()).toBe(false);
});

it('shows the Google IDP on the OAuth settings page', async () => {
await browser.wait(until.presenceOf(crudView.resourceTitle));
expect(browser.getCurrentUrl()).toContain('config.openshift.io~v1~OAuth/cluster');
await crudView.isLoaded();
expect(oauthView.idpTableCellName(idpName).getText()).toEqual(idpName);
expect(oauthView.idpTableCellType(idpName).getText()).toEqual('Google');
expect(oauthView.idpTableCellMapping(idpName).getText()).toEqual('claim');
});
});

describe('Keystone IDP', () => {
const idpName = `keystone-${testName}`;
it('creates a Keystone IDP', async () => {
await browser.get(oauthSettingsURL);
await browser.wait(until.elementToBeClickable(oauthView.addIDPDropdown));
await oauthView.addIDPDropdown.click();
await browser.wait(until.elementToBeClickable(oauthView.keystoneLink));
await oauthView.keystoneLink.click();
await browser.wait(until.elementToBeClickable(oauthView.idpNameInput));
await oauthView.idpNameInput.clear();
await oauthView.idpNameInput.sendKeys(idpName);
await oauthView.keystoneDomainInput.sendKeys('example.com');
await oauthView.keystoneURLInput.sendKeys('https://example.com');
await oauthView.addIDPButton.click();
expect(oauthView.errorMessage.isPresent()).toBe(false);
});

it('shows the Keystone IDP on the OAuth settings page', async () => {
await browser.wait(until.presenceOf(crudView.resourceTitle));
expect(browser.getCurrentUrl()).toContain('config.openshift.io~v1~OAuth/cluster');
await crudView.isLoaded();
expect(oauthView.idpTableCellName(idpName).getText()).toEqual(idpName);
expect(oauthView.idpTableCellType(idpName).getText()).toEqual('Keystone');
expect(oauthView.idpTableCellMapping(idpName).getText()).toEqual('claim');
});
});

describe('LDAP IDP', () => {
const idpName = `ldap-${testName}`;
it('creates a LDAP IDP', async () => {
await browser.get(oauthSettingsURL);
await browser.wait(until.elementToBeClickable(oauthView.addIDPDropdown));
await oauthView.addIDPDropdown.click();
await browser.wait(until.elementToBeClickable(oauthView.ldapLink));
await oauthView.ldapLink.click();
await browser.wait(until.elementToBeClickable(oauthView.idpNameInput));
await oauthView.idpNameInput.clear();
await oauthView.idpNameInput.sendKeys(idpName);
await oauthView.ldapURLInput.sendKeys('ldap://ldap.example.com/o=Acme?cn?sub?(enabled=true)');
await oauthView.addIDPButton.click();
expect(oauthView.errorMessage.isPresent()).toBe(false);
});

it('shows the LDAP IDP on the OAuth settings page', async () => {
await browser.wait(until.presenceOf(crudView.resourceTitle));
expect(browser.getCurrentUrl()).toContain('config.openshift.io~v1~OAuth/cluster');
await crudView.isLoaded();
expect(oauthView.idpTableCellName(idpName).getText()).toEqual(idpName);
expect(oauthView.idpTableCellType(idpName).getText()).toEqual('LDAP');
expect(oauthView.idpTableCellMapping(idpName).getText()).toEqual('claim');
});
});

describe('OpenID IDP', () => {
const idpName = `oidc-${testName}`;
it('creates a OpenID IDP', async () => {
await browser.get(oauthSettingsURL);
await browser.wait(until.elementToBeClickable(oauthView.addIDPDropdown));
await oauthView.addIDPDropdown.click();
await browser.wait(until.elementToBeClickable(oauthView.oidcLink));
await oauthView.oidcLink.click();
await browser.wait(until.elementToBeClickable(oauthView.idpNameInput));
await oauthView.idpNameInput.clear();
await oauthView.idpNameInput.sendKeys(idpName);
await oauthView.oidcClientIDInput.sendKeys('my-client-id');
await oauthView.oidcClientSecretInput.sendKeys('my-client-secret');
await oauthView.oidcIssuerInput.sendKeys('https://example.com');
await oauthView.addIDPButton.click();
expect(oauthView.errorMessage.isPresent()).toBe(false);
});

it('shows the OpenID IDP on the OAuth settings page', async () => {
await browser.wait(until.presenceOf(crudView.resourceTitle));
expect(browser.getCurrentUrl()).toContain('config.openshift.io~v1~OAuth/cluster');
await crudView.isLoaded();
expect(oauthView.idpTableCellName(idpName).getText()).toEqual(idpName);
expect(oauthView.idpTableCellType(idpName).getText()).toEqual('OpenID');
expect(oauthView.idpTableCellMapping(idpName).getText()).toEqual('claim');
});
});
});
46 changes: 46 additions & 0 deletions frontend/integration-tests/views/oauth.view.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
import { $ } from 'protractor';

export const addIDPDropdown = $('[data-test-id="dropdown-button"]');
export const idpNameInput = $('#idp-name');
export const addIDPButton = $('[data-test-id="add-idp"]');
export const idpTableCellName = (name: string) => $(`[data-test-idp-name="${name}"]`);
export const idpTableCellType = (name: string) => $(`[data-test-idp-type-for="${name}"]`);
export const idpTableCellMapping = (name: string) => $(`[data-test-idp-mapping-for="${name}"]`);
export const errorMessage = $('.pf-c-alert.pf-m-danger');

// BasicAuth IDP
export const basicAuthLink = $('#basicauth-link');
export const basicAuthURLInput = $('#url');

// GitHub IDP
export const githubLink = $('#github-link');
export const githubClientIDInput = $('#client-id');
export const githubClientSecretInput = $('#client-secret');
export const githubOrganizationInput = $('[data-test-list-input-for="Organization"]');

// GitLab IDP
export const gitlabLink = $('#gitlab-link');
export const gitlabURLInput = $('#url');
export const gitlabClientIDInput = $('#client-id');
export const gitlabClientSecretInput = $('#client-secret');

// Google IDP
export const googleLink = $('#google-link');
export const googleClientIDInput = $('#client-id');
export const googleClientSecretInput = $('#client-secret');
export const googleHostedDomainInput = $('#hosted-domain');

// Keystone IDP
export const keystoneLink = $('#keystone-link');
export const keystoneDomainInput = $('#domain-name');
export const keystoneURLInput = $('#url');

// LDAP IDP
export const ldapLink = $('#ldap-link');
export const ldapURLInput = $('#url');

// OpenID Connect IDP
export const oidcLink = $('#oidconnect-link');
export const oidcClientIDInput = $('#client-id');
export const oidcClientSecretInput = $('#client-secret');
export const oidcIssuerInput = $('#issuer');
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,9 @@ export class AddBasicAuthPage extends PromiseComponent<{}, AddBasicAuthPageState
// Clear any previous errors.
this.setState({ errorMessage: '' });
this.getOAuthResource().then((oauth: OAuthKind) => {
this.addBasicAuthIDP(oauth, mockNames.secret, mockNames.ca, true)
const mockSecret = this.state.certFileContent ? mockNames.secret : '';
const mockCA = this.state.caFileContent ? mockNames.ca : '';
this.addBasicAuthIDP(oauth, mockSecret, mockCA, true)
.then(() => {
const promises = [this.createTLSSecret(), this.createCAConfigMap()];

Expand Down Expand Up @@ -213,7 +215,7 @@ export class AddBasicAuthPage extends PromiseComponent<{}, AddBasicAuthPageState
</div>
<ButtonBar errorMessage={this.state.errorMessage} inProgress={this.state.inProgress}>
<ActionGroup className="pf-c-form">
<Button type="submit" variant="primary">
<Button type="submit" variant="primary" data-test-id="add-idp">
Add
</Button>
<Button type="button" variant="secondary" onClick={history.goBack}>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,8 @@ export class AddGitHubPage extends PromiseComponent<{}, AddGitHubPageState> {
// Clear any previous errors.
this.setState({ errorMessage: '' });
this.getOAuthResource().then((oauth: OAuthKind) => {
this.addGitHubIDP(oauth, mockNames.secret, mockNames.ca, true)
const mockCA = this.state.caFileContent ? mockNames.ca : '';
this.addGitHubIDP(oauth, mockNames.secret, mockCA, true)
.then(() => {
const promises = [this.createClientSecret(), this.createCAConfigMap()];

Expand Down Expand Up @@ -235,7 +236,7 @@ export class AddGitHubPage extends PromiseComponent<{}, AddGitHubPageState> {
/>
<ButtonBar errorMessage={this.state.errorMessage} inProgress={this.state.inProgress}>
<ActionGroup className="pf-c-form">
<Button type="submit" variant="primary">
<Button type="submit" variant="primary" data-test-id="add-idp">
Add
</Button>
<Button type="button" variant="secondary" onClick={history.goBack}>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,8 @@ export class AddGitLabPage extends PromiseComponent<{}, AddGitLabPageState> {
// Clear any previous errors.
this.setState({ errorMessage: '' });
this.getOAuthResource().then((oauth: OAuthKind) => {
this.addGitLabIDP(oauth, mockNames.secret, mockNames.ca, true)
const mockCA = this.state.caFileContent ? mockNames.ca : '';
this.addGitLabIDP(oauth, mockNames.secret, mockCA, true)
.then(() => {
const promises = [this.createClientSecret(), this.createCAConfigMap()];

Expand Down Expand Up @@ -194,7 +195,7 @@ export class AddGitLabPage extends PromiseComponent<{}, AddGitLabPageState> {
<IDPCAFileInput value={caFileContent} onChange={this.caFileChanged} />
<ButtonBar errorMessage={this.state.errorMessage} inProgress={this.state.inProgress}>
<ActionGroup className="pf-c-form">
<Button type="submit" variant="primary">
<Button type="submit" variant="primary" data-test-id="add-idp">
Add
</Button>
<Button type="button" variant="secondary" onClick={history.goBack}>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,7 @@ export class AddGooglePage extends PromiseComponent<{}, AddGooglePageState> {
</div>
<ButtonBar errorMessage={this.state.errorMessage} inProgress={this.state.inProgress}>
<ActionGroup className="pf-c-form">
<Button type="submit" variant="primary">
<Button type="submit" variant="primary" data-test-id="add-idp">
Add
</Button>
<Button type="button" variant="secondary" onClick={history.goBack}>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,9 @@ export class AddKeystonePage extends PromiseComponent<{}, AddKeystonePageState>
// Clear any previous errors.
this.setState({ errorMessage: '' });
this.getOAuthResource().then((oauth: OAuthKind) => {
this.addKeystoneIDP(oauth, mockNames.secret, mockNames.ca, true)
const mockSecret = this.state.certFileContent ? mockNames.secret : '';
const mockCA = this.state.caFileContent ? mockNames.ca : '';
this.addKeystoneIDP(oauth, mockSecret, mockCA, true)
.then(() => {
const promises = [this.createTLSSecret(), this.createCAConfigMap()];

Expand Down Expand Up @@ -232,7 +234,7 @@ export class AddKeystonePage extends PromiseComponent<{}, AddKeystonePageState>
</div>
<ButtonBar errorMessage={this.state.errorMessage} inProgress={this.state.inProgress}>
<ActionGroup className="pf-c-form">
<Button type="submit" variant="primary">
<Button type="submit" variant="primary" data-test-id="add-idp">
Add
</Button>
<Button type="button" variant="secondary" onClick={history.goBack}>
Expand Down

0 comments on commit 562ef8b

Please sign in to comment.