Skip to content

Commit

Permalink
feat: merge "Allow to pass runtime credentials to kc.login and kc.fak…
Browse files Browse the repository at this point in the history
…eLogin"
  • Loading branch information
davidkaufmann committed Aug 11, 2021
2 parents 54a0a70 + 0d7cea0 commit fb46050
Show file tree
Hide file tree
Showing 8 changed files with 219 additions and 21 deletions.
26 changes: 23 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,11 +47,31 @@ Setup the Keycloak configuration in `cypress.json` configuration file:
}
```

You can override this settings for some tests using [Enviroment variabiles](https://docs.cypress.io/guides/guides/environment-variables.html).
You can override this settings for some tests using [Environment variables](https://docs.cypress.io/guides/guides/environment-variables.html).

### Login commands for E2E Tests

For logging in with Keycloak you must create a [fixture](https://docs.cypress.io/api/commands/fixture.html) containing the user credentials under the directory `cypress/fixtures/users`. For example you can create a file `cypress/fixtures/users/user.json` with this content:
For logging in with Keycloak there are two possibilities
#### Using Variables

This is the recommended approach, since it enables the usage of [Environment variables](https://docs.cypress.io/guides/guides/environment-variables.html) for production environments.

```typescript
describe("Keycloak Login", () => {
beforeEach(() => {
cy.kcLogout();
cy.kcLogin({
username: "user",
password: "password"
});
cy.visit("/");
});
});
```

#### Using fixtures

Create a [fixture](https://docs.cypress.io/api/commands/fixture.html) containing the user credentials under the directory `cypress/fixtures/users`. For example you can create a file `cypress/fixtures/users/user.json` with this content:

```json
{
Expand Down Expand Up @@ -143,7 +163,7 @@ describe("Keycloak Fake Login", () => {

#### Session Status iframe

At the moment within Cypress is not possible to mock iframe loading and APIs called from an iframe. For this reason, when you use `kcFakeLogin` you have to disable the Session Status iframe, otherwise the Javascript adapter will redirect you to the real Keyacloak instance. You can disable it only when the app is running inside Cypress:
At the moment within Cypress is not possible to mock iframe loading and APIs called from an iframe. For this reason, when you use `kcFakeLogin` you have to disable the Session Status iframe, otherwise the Javascript adapter will redirect you to the real Keycloak instance. You can disable it only when the app is running inside Cypress:

```typescript
const checkLoginIframe = window.Cypress ? false : true;
Expand Down
90 changes: 90 additions & 0 deletions cypress/integration/fake-login.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,3 +33,93 @@ describe("Keycloak Fake Login", () => {
cy.get("#output").should("contain.text", "Init Success (Authenticated)");
});
});

describe("Keycloak Fake Login with runtime credentials", () => {
it("should show user as authenticated", () => {
cy.kcFakeLogin({
fakeLogin: {
access_token: "eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJGSjg2R2NGM2pUYk5MT2NvNE52WmtVQ0lVbWZZQ3FvcXRPUWVNZmJoTmxFIn0.eyJqdGkiOiJhZTZhMmQ4Zi1lNTZiLTQ4MWQtOThhMS1hNzU5NzMzNDg1ZGYiLCJleHAiOjE1ODAxMjYyMjEsIm5iZiI6MCwiaWF0IjoxNTgwMTI1OTIxLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODEvYXV0aC9yZWFsbXMvZXhhbXBsZSIsImF1ZCI6ImFjY291bnQiLCJzdWIiOiI2N2MzMzEzNC1hYWExLTRkODgtYTdjZS0zNTQwOGQwZjEzMzIiLCJ0eXAiOiJCZWFyZXIiLCJhenAiOiJqcy1jb25zb2xlIiwibm9uY2UiOiJiZjJmODA2OS0yYTNmLTQzY2EtOWI2Yy1kOTk2NzE4MDZmNTYiLCJhdXRoX3RpbWUiOjE1ODAxMjU5MjEsInNlc3Npb25fc3RhdGUiOiI2N2U2YWZjNS03OTE3LTQ3MjAtYmViNy0xYWM1ZDFmNDlkOTUiLCJhY3IiOiIxIiwiYWxsb3dlZC1vcmlnaW5zIjpbImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MCJdLCJyZWFsbV9hY2Nlc3MiOnsicm9sZXMiOlsidXNlciJdfSwicmVzb3VyY2VfYWNjZXNzIjp7ImFjY291bnQiOnsicm9sZXMiOlsibWFuYWdlLWFjY291bnQiLCJtYW5hZ2UtYWNjb3VudC1saW5rcyIsInZpZXctcHJvZmlsZSJdfX0sInNjb3BlIjoib3BlbmlkIGVtYWlsIHByb2ZpbGUiLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsIm5hbWUiOiJTYW1wbGUgVXNlciIsInByZWZlcnJlZF91c2VybmFtZSI6InVzZXIiLCJnaXZlbl9uYW1lIjoiU2FtcGxlIiwiZmFtaWx5X25hbWUiOiJVc2VyIiwiZW1haWwiOiJzYW1wbGUtdXNlckBleGFtcGxlIn0.Cb_WD_L2XyWUCt9h6QUs6aTxbGbOod9zbE2hfeNVMzGhKc2t22CgvaiUbhs1YmETGxGd7_ABR3G-Z99pmJQYDydEo4AdLfqztssJOr53mAgal_J64JIs0sl0e26sE3Cdd6K0ZS0W3eHHNmlGxOFL5erphWN53BZ-HX9JG0I3K1c",
refresh_token: "eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJmZGIyYmYyYS1jMDI1LTRmODEtYWZmMi1hYTJlY2FjNzg1MTYifQ.eyJqdGkiOiJjYWE0YTllYi04NGZhLTRhMTMtYjZjZS0yMjM4ZmVlYzYyM2UiLCJleHAiOjE1ODAxMjc3MjEsIm5iZiI6MCwiaWF0IjoxNTgwMTI1OTIxLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODEvYXV0aC9yZWFsbXMvZXhhbXBsZSIsImF1ZCI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MS9hdXRoL3JlYWxtcy9leGFtcGxlIiwic3ViIjoiNjdjMzMxMzQtYWFhMS00ZDg4LWE3Y2UtMzU0MDhkMGYxMzMyIiwidHlwIjoiUmVmcmVzaCIsImF6cCI6ImpzLWNvbnNvbGUiLCJub25jZSI6ImJmMmY4MDY5LTJhM2YtNDNjYS05YjZjLWQ5OTY3MTgwNmY1NiIsImF1dGhfdGltZSI6MCwic2Vzc2lvbl9zdGF0ZSI6IjY3ZTZhZmM1LTc5MTctNDcyMC1iZWI3LTFhYzVkMWY0OWQ5NSIsInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJ1c2VyIl19LCJyZXNvdXJjZV9hY2Nlc3MiOnsiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWNjb3VudCIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19fSwic2NvcGUiOiJvcGVuaWQgZW1haWwgcHJvZmlsZSJ9.6BVpoZCsZbb6vPpdFwspAFT8lYCLYyNrcrOU-27VMaY",
id_token: "eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJGSjg2R2NGM2pUYk5MT2NvNE52WmtVQ0lVbWZZQ3FvcXRPUWVNZmJoTmxFIn0.eyJqdGkiOiIzNjMxZTZlNi03MTQ1LTQyZWUtOWU2Yi01MDFkNDFhZGI1NGYiLCJleHAiOjE1ODAxMjYyMjEsIm5iZiI6MCwiaWF0IjoxNTgwMTI1OTIxLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODEvYXV0aC9yZWFsbXMvZXhhbXBsZSIsImF1ZCI6ImpzLWNvbnNvbGUiLCJzdWIiOiI2N2MzMzEzNC1hYWExLTRkODgtYTdjZS0zNTQwOGQwZjEzMzIiLCJ0eXAiOiJJRCIsImF6cCI6ImpzLWNvbnNvbGUiLCJub25jZSI6ImJmMmY4MDY5LTJhM2YtNDNjYS05YjZjLWQ5OTY3MTgwNmY1NiIsImF1dGhfdGltZSI6MTU4MDEyNTkyMSwic2Vzc2lvbl9zdGF0ZSI6IjY3ZTZhZmM1LTc5MTctNDcyMC1iZWI3LTFhYzVkMWY0OWQ5NSIsImFjciI6IjEiLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsIm5hbWUiOiJTYW1wbGUgVXNlciIsInByZWZlcnJlZF91c2VybmFtZSI6InVzZXIiLCJnaXZlbl9uYW1lIjoiU2FtcGxlIiwiZmFtaWx5X25hbWUiOiJVc2VyIiwiZW1haWwiOiJzYW1wbGUtdXNlckBleGFtcGxlIn0.pDHa-ioVBiHNRHiu0atnKTNHn2d_NPMFYBoiQXTuZ4Wj0jfwUqsOD1KIC1t5Q1-OBNLjnzBRhm8qfvg3Vm-B7mNchIJkGOJlF8XcN7e1VyXOWb2yNvZ4TL5QtF_5aVx-_WgpajiUdQyKVEWtwMbb1qyKMVHH2vIxtzep9Sy2zek",
account: {
username: "user",
firstName: "Sample",
lastName: "User",
email: "sample-user@example",
emailVerified: false,
attributes: {}
}
}
});
cy.get("#output").should("contain.text", "Init Success (Authenticated)");
});

it("should get user data equal to fixture data", () => {
cy.kcFakeLogin({
fakeLogin: {
access_token: "eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJGSjg2R2NGM2pUYk5MT2NvNE52WmtVQ0lVbWZZQ3FvcXRPUWVNZmJoTmxFIn0.eyJqdGkiOiJhZTZhMmQ4Zi1lNTZiLTQ4MWQtOThhMS1hNzU5NzMzNDg1ZGYiLCJleHAiOjE1ODAxMjYyMjEsIm5iZiI6MCwiaWF0IjoxNTgwMTI1OTIxLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODEvYXV0aC9yZWFsbXMvZXhhbXBsZSIsImF1ZCI6ImFjY291bnQiLCJzdWIiOiI2N2MzMzEzNC1hYWExLTRkODgtYTdjZS0zNTQwOGQwZjEzMzIiLCJ0eXAiOiJCZWFyZXIiLCJhenAiOiJqcy1jb25zb2xlIiwibm9uY2UiOiJiZjJmODA2OS0yYTNmLTQzY2EtOWI2Yy1kOTk2NzE4MDZmNTYiLCJhdXRoX3RpbWUiOjE1ODAxMjU5MjEsInNlc3Npb25fc3RhdGUiOiI2N2U2YWZjNS03OTE3LTQ3MjAtYmViNy0xYWM1ZDFmNDlkOTUiLCJhY3IiOiIxIiwiYWxsb3dlZC1vcmlnaW5zIjpbImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MCJdLCJyZWFsbV9hY2Nlc3MiOnsicm9sZXMiOlsidXNlciJdfSwicmVzb3VyY2VfYWNjZXNzIjp7ImFjY291bnQiOnsicm9sZXMiOlsibWFuYWdlLWFjY291bnQiLCJtYW5hZ2UtYWNjb3VudC1saW5rcyIsInZpZXctcHJvZmlsZSJdfX0sInNjb3BlIjoib3BlbmlkIGVtYWlsIHByb2ZpbGUiLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsIm5hbWUiOiJTYW1wbGUgVXNlciIsInByZWZlcnJlZF91c2VybmFtZSI6InVzZXIiLCJnaXZlbl9uYW1lIjoiU2FtcGxlIiwiZmFtaWx5X25hbWUiOiJVc2VyIiwiZW1haWwiOiJzYW1wbGUtdXNlckBleGFtcGxlIn0.Cb_WD_L2XyWUCt9h6QUs6aTxbGbOod9zbE2hfeNVMzGhKc2t22CgvaiUbhs1YmETGxGd7_ABR3G-Z99pmJQYDydEo4AdLfqztssJOr53mAgal_J64JIs0sl0e26sE3Cdd6K0ZS0W3eHHNmlGxOFL5erphWN53BZ-HX9JG0I3K1c",
refresh_token: "eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJmZGIyYmYyYS1jMDI1LTRmODEtYWZmMi1hYTJlY2FjNzg1MTYifQ.eyJqdGkiOiJjYWE0YTllYi04NGZhLTRhMTMtYjZjZS0yMjM4ZmVlYzYyM2UiLCJleHAiOjE1ODAxMjc3MjEsIm5iZiI6MCwiaWF0IjoxNTgwMTI1OTIxLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODEvYXV0aC9yZWFsbXMvZXhhbXBsZSIsImF1ZCI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MS9hdXRoL3JlYWxtcy9leGFtcGxlIiwic3ViIjoiNjdjMzMxMzQtYWFhMS00ZDg4LWE3Y2UtMzU0MDhkMGYxMzMyIiwidHlwIjoiUmVmcmVzaCIsImF6cCI6ImpzLWNvbnNvbGUiLCJub25jZSI6ImJmMmY4MDY5LTJhM2YtNDNjYS05YjZjLWQ5OTY3MTgwNmY1NiIsImF1dGhfdGltZSI6MCwic2Vzc2lvbl9zdGF0ZSI6IjY3ZTZhZmM1LTc5MTctNDcyMC1iZWI3LTFhYzVkMWY0OWQ5NSIsInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJ1c2VyIl19LCJyZXNvdXJjZV9hY2Nlc3MiOnsiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWNjb3VudCIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19fSwic2NvcGUiOiJvcGVuaWQgZW1haWwgcHJvZmlsZSJ9.6BVpoZCsZbb6vPpdFwspAFT8lYCLYyNrcrOU-27VMaY",
id_token: "eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJGSjg2R2NGM2pUYk5MT2NvNE52WmtVQ0lVbWZZQ3FvcXRPUWVNZmJoTmxFIn0.eyJqdGkiOiIzNjMxZTZlNi03MTQ1LTQyZWUtOWU2Yi01MDFkNDFhZGI1NGYiLCJleHAiOjE1ODAxMjYyMjEsIm5iZiI6MCwiaWF0IjoxNTgwMTI1OTIxLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODEvYXV0aC9yZWFsbXMvZXhhbXBsZSIsImF1ZCI6ImpzLWNvbnNvbGUiLCJzdWIiOiI2N2MzMzEzNC1hYWExLTRkODgtYTdjZS0zNTQwOGQwZjEzMzIiLCJ0eXAiOiJJRCIsImF6cCI6ImpzLWNvbnNvbGUiLCJub25jZSI6ImJmMmY4MDY5LTJhM2YtNDNjYS05YjZjLWQ5OTY3MTgwNmY1NiIsImF1dGhfdGltZSI6MTU4MDEyNTkyMSwic2Vzc2lvbl9zdGF0ZSI6IjY3ZTZhZmM1LTc5MTctNDcyMC1iZWI3LTFhYzVkMWY0OWQ5NSIsImFjciI6IjEiLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsIm5hbWUiOiJTYW1wbGUgVXNlciIsInByZWZlcnJlZF91c2VybmFtZSI6InVzZXIiLCJnaXZlbl9uYW1lIjoiU2FtcGxlIiwiZmFtaWx5X25hbWUiOiJVc2VyIiwiZW1haWwiOiJzYW1wbGUtdXNlckBleGFtcGxlIn0.pDHa-ioVBiHNRHiu0atnKTNHn2d_NPMFYBoiQXTuZ4Wj0jfwUqsOD1KIC1t5Q1-OBNLjnzBRhm8qfvg3Vm-B7mNchIJkGOJlF8XcN7e1VyXOWb2yNvZ4TL5QtF_5aVx-_WgpajiUdQyKVEWtwMbb1qyKMVHH2vIxtzep9Sy2zek",
account: {
username: "user",
firstName: "Sample",
lastName: "User",
email: "sample-user@example",
emailVerified: false,
attributes: {}
}
}
});
cy.get("#output").should("contain.text", "Init Success (Authenticated)");

cy.findByText("Get Profile").click();

cy.fixture("users/user.json").then((userData: UserData) => {
cy.get("#output").should(el => {
const value = JSON.parse(el.text());
expect(value).to.deep.equal(userData.fakeLogin?.account);
});
});
});

it("should go to the specified path with hash and show user as authenticated", () => {
cy.kcFakeLogin({
fakeLogin: {
access_token: "eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJGSjg2R2NGM2pUYk5MT2NvNE52WmtVQ0lVbWZZQ3FvcXRPUWVNZmJoTmxFIn0.eyJqdGkiOiJhZTZhMmQ4Zi1lNTZiLTQ4MWQtOThhMS1hNzU5NzMzNDg1ZGYiLCJleHAiOjE1ODAxMjYyMjEsIm5iZiI6MCwiaWF0IjoxNTgwMTI1OTIxLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODEvYXV0aC9yZWFsbXMvZXhhbXBsZSIsImF1ZCI6ImFjY291bnQiLCJzdWIiOiI2N2MzMzEzNC1hYWExLTRkODgtYTdjZS0zNTQwOGQwZjEzMzIiLCJ0eXAiOiJCZWFyZXIiLCJhenAiOiJqcy1jb25zb2xlIiwibm9uY2UiOiJiZjJmODA2OS0yYTNmLTQzY2EtOWI2Yy1kOTk2NzE4MDZmNTYiLCJhdXRoX3RpbWUiOjE1ODAxMjU5MjEsInNlc3Npb25fc3RhdGUiOiI2N2U2YWZjNS03OTE3LTQ3MjAtYmViNy0xYWM1ZDFmNDlkOTUiLCJhY3IiOiIxIiwiYWxsb3dlZC1vcmlnaW5zIjpbImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MCJdLCJyZWFsbV9hY2Nlc3MiOnsicm9sZXMiOlsidXNlciJdfSwicmVzb3VyY2VfYWNjZXNzIjp7ImFjY291bnQiOnsicm9sZXMiOlsibWFuYWdlLWFjY291bnQiLCJtYW5hZ2UtYWNjb3VudC1saW5rcyIsInZpZXctcHJvZmlsZSJdfX0sInNjb3BlIjoib3BlbmlkIGVtYWlsIHByb2ZpbGUiLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsIm5hbWUiOiJTYW1wbGUgVXNlciIsInByZWZlcnJlZF91c2VybmFtZSI6InVzZXIiLCJnaXZlbl9uYW1lIjoiU2FtcGxlIiwiZmFtaWx5X25hbWUiOiJVc2VyIiwiZW1haWwiOiJzYW1wbGUtdXNlckBleGFtcGxlIn0.Cb_WD_L2XyWUCt9h6QUs6aTxbGbOod9zbE2hfeNVMzGhKc2t22CgvaiUbhs1YmETGxGd7_ABR3G-Z99pmJQYDydEo4AdLfqztssJOr53mAgal_J64JIs0sl0e26sE3Cdd6K0ZS0W3eHHNmlGxOFL5erphWN53BZ-HX9JG0I3K1c",
refresh_token: "eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJmZGIyYmYyYS1jMDI1LTRmODEtYWZmMi1hYTJlY2FjNzg1MTYifQ.eyJqdGkiOiJjYWE0YTllYi04NGZhLTRhMTMtYjZjZS0yMjM4ZmVlYzYyM2UiLCJleHAiOjE1ODAxMjc3MjEsIm5iZiI6MCwiaWF0IjoxNTgwMTI1OTIxLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODEvYXV0aC9yZWFsbXMvZXhhbXBsZSIsImF1ZCI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MS9hdXRoL3JlYWxtcy9leGFtcGxlIiwic3ViIjoiNjdjMzMxMzQtYWFhMS00ZDg4LWE3Y2UtMzU0MDhkMGYxMzMyIiwidHlwIjoiUmVmcmVzaCIsImF6cCI6ImpzLWNvbnNvbGUiLCJub25jZSI6ImJmMmY4MDY5LTJhM2YtNDNjYS05YjZjLWQ5OTY3MTgwNmY1NiIsImF1dGhfdGltZSI6MCwic2Vzc2lvbl9zdGF0ZSI6IjY3ZTZhZmM1LTc5MTctNDcyMC1iZWI3LTFhYzVkMWY0OWQ5NSIsInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJ1c2VyIl19LCJyZXNvdXJjZV9hY2Nlc3MiOnsiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWNjb3VudCIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19fSwic2NvcGUiOiJvcGVuaWQgZW1haWwgcHJvZmlsZSJ9.6BVpoZCsZbb6vPpdFwspAFT8lYCLYyNrcrOU-27VMaY",
id_token: "eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJGSjg2R2NGM2pUYk5MT2NvNE52WmtVQ0lVbWZZQ3FvcXRPUWVNZmJoTmxFIn0.eyJqdGkiOiIzNjMxZTZlNi03MTQ1LTQyZWUtOWU2Yi01MDFkNDFhZGI1NGYiLCJleHAiOjE1ODAxMjYyMjEsIm5iZiI6MCwiaWF0IjoxNTgwMTI1OTIxLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODEvYXV0aC9yZWFsbXMvZXhhbXBsZSIsImF1ZCI6ImpzLWNvbnNvbGUiLCJzdWIiOiI2N2MzMzEzNC1hYWExLTRkODgtYTdjZS0zNTQwOGQwZjEzMzIiLCJ0eXAiOiJJRCIsImF6cCI6ImpzLWNvbnNvbGUiLCJub25jZSI6ImJmMmY4MDY5LTJhM2YtNDNjYS05YjZjLWQ5OTY3MTgwNmY1NiIsImF1dGhfdGltZSI6MTU4MDEyNTkyMSwic2Vzc2lvbl9zdGF0ZSI6IjY3ZTZhZmM1LTc5MTctNDcyMC1iZWI3LTFhYzVkMWY0OWQ5NSIsImFjciI6IjEiLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsIm5hbWUiOiJTYW1wbGUgVXNlciIsInByZWZlcnJlZF91c2VybmFtZSI6InVzZXIiLCJnaXZlbl9uYW1lIjoiU2FtcGxlIiwiZmFtaWx5X25hbWUiOiJVc2VyIiwiZW1haWwiOiJzYW1wbGUtdXNlckBleGFtcGxlIn0.pDHa-ioVBiHNRHiu0atnKTNHn2d_NPMFYBoiQXTuZ4Wj0jfwUqsOD1KIC1t5Q1-OBNLjnzBRhm8qfvg3Vm-B7mNchIJkGOJlF8XcN7e1VyXOWb2yNvZ4TL5QtF_5aVx-_WgpajiUdQyKVEWtwMbb1qyKMVHH2vIxtzep9Sy2zek",
account: {
username: "user",
firstName: "Sample",
lastName: "User",
email: "sample-user@example",
emailVerified: false,
attributes: {}
}
}
}, "#/foobar");
cy.url().should("be.equal", `${Cypress.config("baseUrl")}/#/foobar`);
cy.get("#output").should("contain.text", "Init Success (Authenticated)");
});

it("should go to the specified path without hash and show user as authenticated", () => {
cy.kcFakeLogin({
fakeLogin: {
access_token: "eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJGSjg2R2NGM2pUYk5MT2NvNE52WmtVQ0lVbWZZQ3FvcXRPUWVNZmJoTmxFIn0.eyJqdGkiOiJhZTZhMmQ4Zi1lNTZiLTQ4MWQtOThhMS1hNzU5NzMzNDg1ZGYiLCJleHAiOjE1ODAxMjYyMjEsIm5iZiI6MCwiaWF0IjoxNTgwMTI1OTIxLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODEvYXV0aC9yZWFsbXMvZXhhbXBsZSIsImF1ZCI6ImFjY291bnQiLCJzdWIiOiI2N2MzMzEzNC1hYWExLTRkODgtYTdjZS0zNTQwOGQwZjEzMzIiLCJ0eXAiOiJCZWFyZXIiLCJhenAiOiJqcy1jb25zb2xlIiwibm9uY2UiOiJiZjJmODA2OS0yYTNmLTQzY2EtOWI2Yy1kOTk2NzE4MDZmNTYiLCJhdXRoX3RpbWUiOjE1ODAxMjU5MjEsInNlc3Npb25fc3RhdGUiOiI2N2U2YWZjNS03OTE3LTQ3MjAtYmViNy0xYWM1ZDFmNDlkOTUiLCJhY3IiOiIxIiwiYWxsb3dlZC1vcmlnaW5zIjpbImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MCJdLCJyZWFsbV9hY2Nlc3MiOnsicm9sZXMiOlsidXNlciJdfSwicmVzb3VyY2VfYWNjZXNzIjp7ImFjY291bnQiOnsicm9sZXMiOlsibWFuYWdlLWFjY291bnQiLCJtYW5hZ2UtYWNjb3VudC1saW5rcyIsInZpZXctcHJvZmlsZSJdfX0sInNjb3BlIjoib3BlbmlkIGVtYWlsIHByb2ZpbGUiLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsIm5hbWUiOiJTYW1wbGUgVXNlciIsInByZWZlcnJlZF91c2VybmFtZSI6InVzZXIiLCJnaXZlbl9uYW1lIjoiU2FtcGxlIiwiZmFtaWx5X25hbWUiOiJVc2VyIiwiZW1haWwiOiJzYW1wbGUtdXNlckBleGFtcGxlIn0.Cb_WD_L2XyWUCt9h6QUs6aTxbGbOod9zbE2hfeNVMzGhKc2t22CgvaiUbhs1YmETGxGd7_ABR3G-Z99pmJQYDydEo4AdLfqztssJOr53mAgal_J64JIs0sl0e26sE3Cdd6K0ZS0W3eHHNmlGxOFL5erphWN53BZ-HX9JG0I3K1c",
refresh_token: "eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJmZGIyYmYyYS1jMDI1LTRmODEtYWZmMi1hYTJlY2FjNzg1MTYifQ.eyJqdGkiOiJjYWE0YTllYi04NGZhLTRhMTMtYjZjZS0yMjM4ZmVlYzYyM2UiLCJleHAiOjE1ODAxMjc3MjEsIm5iZiI6MCwiaWF0IjoxNTgwMTI1OTIxLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODEvYXV0aC9yZWFsbXMvZXhhbXBsZSIsImF1ZCI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MS9hdXRoL3JlYWxtcy9leGFtcGxlIiwic3ViIjoiNjdjMzMxMzQtYWFhMS00ZDg4LWE3Y2UtMzU0MDhkMGYxMzMyIiwidHlwIjoiUmVmcmVzaCIsImF6cCI6ImpzLWNvbnNvbGUiLCJub25jZSI6ImJmMmY4MDY5LTJhM2YtNDNjYS05YjZjLWQ5OTY3MTgwNmY1NiIsImF1dGhfdGltZSI6MCwic2Vzc2lvbl9zdGF0ZSI6IjY3ZTZhZmM1LTc5MTctNDcyMC1iZWI3LTFhYzVkMWY0OWQ5NSIsInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJ1c2VyIl19LCJyZXNvdXJjZV9hY2Nlc3MiOnsiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWNjb3VudCIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19fSwic2NvcGUiOiJvcGVuaWQgZW1haWwgcHJvZmlsZSJ9.6BVpoZCsZbb6vPpdFwspAFT8lYCLYyNrcrOU-27VMaY",
id_token: "eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJGSjg2R2NGM2pUYk5MT2NvNE52WmtVQ0lVbWZZQ3FvcXRPUWVNZmJoTmxFIn0.eyJqdGkiOiIzNjMxZTZlNi03MTQ1LTQyZWUtOWU2Yi01MDFkNDFhZGI1NGYiLCJleHAiOjE1ODAxMjYyMjEsIm5iZiI6MCwiaWF0IjoxNTgwMTI1OTIxLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODEvYXV0aC9yZWFsbXMvZXhhbXBsZSIsImF1ZCI6ImpzLWNvbnNvbGUiLCJzdWIiOiI2N2MzMzEzNC1hYWExLTRkODgtYTdjZS0zNTQwOGQwZjEzMzIiLCJ0eXAiOiJJRCIsImF6cCI6ImpzLWNvbnNvbGUiLCJub25jZSI6ImJmMmY4MDY5LTJhM2YtNDNjYS05YjZjLWQ5OTY3MTgwNmY1NiIsImF1dGhfdGltZSI6MTU4MDEyNTkyMSwic2Vzc2lvbl9zdGF0ZSI6IjY3ZTZhZmM1LTc5MTctNDcyMC1iZWI3LTFhYzVkMWY0OWQ5NSIsImFjciI6IjEiLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsIm5hbWUiOiJTYW1wbGUgVXNlciIsInByZWZlcnJlZF91c2VybmFtZSI6InVzZXIiLCJnaXZlbl9uYW1lIjoiU2FtcGxlIiwiZmFtaWx5X25hbWUiOiJVc2VyIiwiZW1haWwiOiJzYW1wbGUtdXNlckBleGFtcGxlIn0.pDHa-ioVBiHNRHiu0atnKTNHn2d_NPMFYBoiQXTuZ4Wj0jfwUqsOD1KIC1t5Q1-OBNLjnzBRhm8qfvg3Vm-B7mNchIJkGOJlF8XcN7e1VyXOWb2yNvZ4TL5QtF_5aVx-_WgpajiUdQyKVEWtwMbb1qyKMVHH2vIxtzep9Sy2zek",
account: {
username: "user",
firstName: "Sample",
lastName: "User",
email: "sample-user@example",
emailVerified: false,
attributes: {}
}
}
}, "index.html");
cy.url().should("be.equal", `${Cypress.config("baseUrl")}/index.html`);
cy.get("#output").should("contain.text", "Init Success (Authenticated)");
});
});

60 changes: 60 additions & 0 deletions cypress/integration/login.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -57,3 +57,63 @@ describe("Keycloak Login", () => {
});
});
});

describe("Keycloak Login with runtime credentials", () => {
beforeEach(() => {
cy.kcLogout();
cy.kcLogin({
username: "user",
password: "password"
}).as("tokens");
cy.visit("");
});

it("should show user as authenticated", () => {
cy.get("#output").should("contain.text", "Init Success (Authenticated)");
});

it("should have saved accessToken", () => {
cy.get("#output").should("contain.text", "Init Success (Authenticated)");

cy.get<KcTokens>("@tokens").should(tokens => {
expect(tokens)
.to.have.property("access_token")
.to.have.length.greaterThan(0);

expect(tokens)
.to.have.property("id_token")
.to.have.length.greaterThan(0);

expect(tokens)
.to.have.property("refresh_token")
.to.have.length.greaterThan(0);
});
});

it("should refresh tokens correctly", () => {
cy.server();
cy.route("post", "**/protocol/openid-connect/token").as("tokenRoute");

cy.get("#output").should("contain.text", "Init Success (Authenticated)");

cy.findByText("Refresh Token").click();

cy.wait("@tokenRoute").then(xhr => {
expect(xhr.status).to.be.equal(200);

const body = xhr.responseBody;

expect(body)
.to.have.property("access_token")
.to.have.length.greaterThan(0);

expect(body)
.to.have.property("id_token")
.to.have.length.greaterThan(0);

expect(body)
.to.have.property("refresh_token")
.to.have.length.greaterThan(0);
});
});
});
8 changes: 4 additions & 4 deletions index.d.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
/// <reference types="cypress" />

interface UserData {
username: string;
password: string;
username?: string;
password?: string;
fakeLogin?: {
access_token: string;
refresh_token: string;
Expand All @@ -20,8 +20,8 @@ interface KcTokens {
// eslint-disable-next-line no-unused-vars
declare namespace Cypress {
interface Chainable {
kcLogin(user: string): Chainable<KcTokens>;
kcLogin(user: string | UserData): Chainable<KcTokens>;
kcLogout(): Chainable<void>;
kcFakeLogin(user: string, visitUrl?: string): Chainable<void>;
kcFakeLogin(user: string | UserData, visitUrl?: string): Chainable<void>;
}
}
Loading

0 comments on commit fb46050

Please sign in to comment.