Merge branch 'main' into fix-flaky-origin-test

This commit is contained in:
Susmitha Girumala authored and GitHub committed 2021-05-10 10:32:57 -04:00
commit faaf7352c1
7 files changed
+58 -18

No files matched your search

@@ -11,7 +11,7 @@ export default class ScopesScopeAuthenticateMethodRoute extends Route {
@service session;
@service notify;
@service intl;
@service('browser/window') window;
@service windowManager;
// =methods
@@ -26,22 +26,16 @@ export default class ScopesScopeAuthenticateMethodRoute extends Route {
}
/**
*
* Kicks off the OIDC auth flow by opening a new window to the provider.
* @param {string} authenticatorName
* @param {object} options
*/
async startOIDCAuthentication(authenticatorName, options) {
const oidc = getOwner(this).lookup(authenticatorName);
// TODO: delegate this call from the session service so that we don't have
// to look up the authenticator directly
const json = await oidc.startAuthentication(options);
await this.openExternalOIDCFlow(json.attributes.auth_url);
}
/**
* Opens the specified URL in a new tab or window.
* @param {string} url
*/
openExternalOIDCFlow(url) {
this.window.open(url);
await this.windowManager.open(json.attributes.auth_url);
}
// =actions
@@ -13,6 +13,7 @@ export default class ScopesScopeAuthenticateMethodOidcRoute extends Route {
// =services
@service session;
@service windowManager;
// =attributes
@@ -61,10 +62,12 @@ export default class ScopesScopeAuthenticateMethodOidcRoute extends Route {
}
/**
* When this route is deactivated (exited), stop polling for changes.
* When this route is deactivated (exited), stop polling for changes and close
* any windows opened via the window manager service.
*/
deactivate() {
this.poller.cancelAll();
this.windowManager.closeAll();
}
/**
+1 -1
View File
@@ -28,7 +28,7 @@ export default class WindowManagerService extends Service {
*/
open(url) {
const newWindow = this.window.open(url);
this.add(newWindow);
if (newWindow) this.add(newWindow);
}
/**
+6
View File
@@ -152,6 +152,12 @@
}
}
.rose-dialog-cover {
svg {
max-width: 20rem;
}
}
.copyable {
white-space: nowrap;
@@ -8,9 +8,9 @@
<p>
{{t 'resources.auth-method.questions.no-see-window'}}
<a
href="{{this.authURL}}"
target="_blank"
rel="noreferrer noopener"
href="#"
role="button"
{{on "click" (route-action "authenticate")}}
>
{{t 'actions.retry'}}
</a>
+2 -1
View File
@@ -149,8 +149,9 @@ module.exports = function (environment) {
// Notification timeout should be 0 for fast tests
ENV.notifyTimeout = 0;
// Session polling timeout should be short
// Polling timeouts should be short
ENV.sessionPollingTimeoutSeconds = 0.25;
ENV.oidcPollingTimeoutSeconds = 0;
ENV.enableConfirmService = false;
}
@@ -12,12 +12,14 @@ import {
import { setupApplicationTest } from 'ember-qunit';
import setupMirage from 'ember-cli-mirage/test-support/setup-mirage';
import { Response } from 'miragejs';
//import { run, later } from '@ember/runloop';
import a11yAudit from 'ember-a11y-testing/test-support/audit';
import {
currentSession,
authenticateSession,
invalidateSession,
} from 'ember-simple-auth/test-support';
import Service from '@ember/service';
module('Acceptance | authentication', function (hooks) {
setupApplicationTest(hooks);
@@ -31,12 +33,15 @@ module('Acceptance | authentication', function (hooks) {
let orgScopeURL;
let scope;
let globalAuthMethod;
let authMethod;
let globalAuthMethodID;
let authMethod;
let authMethodID;
let authMethodOIDC;
let authMethodOIDCID;
let globalAuthenticateURL;
let authenticateURL;
let authMethodAuthenticateURL;
let authMethodOIDCAuthenticateURL;
let authMethodGlobalAuthenticateURL;
let changePasswordURL;
let orgsURL;
@@ -72,15 +77,21 @@ module('Acceptance | authentication', function (hooks) {
scope: orgScope,
type: 'password',
});
authMethodOIDC = this.server.create('auth-method', {
scope: orgScope,
type: 'oidc',
});
orgScopeID = orgScope.id;
globalAuthMethodID = globalAuthMethod.id;
authMethodID = authMethod.id;
authMethodOIDCID = authMethodOIDC.id;
scopesURL = `/scopes`;
orgScopeURL = `/scopes/${orgScopeID}`;
globalAuthenticateURL = `/scopes/global/authenticate`;
authenticateURL = `/scopes/${orgScopeID}/authenticate`;
authMethodGlobalAuthenticateURL = `/scopes/global/authenticate/${globalAuthMethodID}`;
authMethodAuthenticateURL = `/scopes/${orgScopeID}/authenticate/${authMethodID}`;
authMethodOIDCAuthenticateURL = `/scopes/${orgScopeID}/authenticate/${authMethodOIDCID}`;
changePasswordURL = `/account/change-password`;
orgsURL = `/scopes/global/scopes`;
orgEditURL = `/scopes/${orgScopeID}/edit`;
@@ -105,6 +116,7 @@ module('Acceptance | authentication', function (hooks) {
test('visiting auth methods authenticate route when there no methods shows a message', async function (assert) {
assert.expect(2);
authMethod.destroy();
authMethodOIDC.destroy();
await visit(authenticateURL);
await a11yAudit();
assert.equal(currentURL(), authenticateURL);
@@ -350,4 +362,28 @@ module('Acceptance | authentication', function (hooks) {
assert.notOk(getRootElement().classList.contains('rose-theme-light'));
assert.notOk(getRootElement().classList.contains('rose-theme-dark'));
});
// TODO: figure out a sustainable test strategy for polling routes
test('OIDC authentication opens a new window and closes it upon completion', async function (assert) {
assert.expect(3);
// Register mock window service
this.owner.register(
'service:browser/window',
class extends Service {
open(/* url */) {
assert.ok(true, 'New window was opened.');
return {
close() {
assert.ok(true, 'New window was closed.');
assert.ok(currentSession().isAuthenticated);
},
};
}
}
);
await visit(authMethodOIDCAuthenticateURL);
await click('form [type="submit"]');
});
// TODO: test OIDC retry and cancel
});