diff --git a/app/components/identity/blocked.hbs b/app/components/identity/blocked.hbs
new file mode 100644
index 00000000..1a3d68fe
--- /dev/null
+++ b/app/components/identity/blocked.hbs
@@ -0,0 +1,8 @@
+
Status Blocked
+
The system failed to link
+ your profile service with the Identity service,
+ Please try again!
+
\ No newline at end of file
diff --git a/app/components/identity/verified.hbs b/app/components/identity/verified.hbs
new file mode 100644
index 00000000..ebad1442
--- /dev/null
+++ b/app/components/identity/verified.hbs
@@ -0,0 +1,6 @@
+
Verified
+
Congratulations!!!
+ You did it, go ahead and tell in the community that you verified your profile
+ service.
\ No newline at end of file
diff --git a/app/templates/identity.hbs b/app/templates/identity.hbs
index a9511781..ebe9143f 100644
--- a/app/templates/identity.hbs
+++ b/app/templates/identity.hbs
@@ -25,6 +25,8 @@
{{else if (eq this.state 'reload')}}
+ {{else if (eq this.state 'verified')}}
+
{{/if}}
diff --git a/tests/integration/components/identity/blocked.js b/tests/integration/components/identity/blocked.js
new file mode 100644
index 00000000..83b9051c
--- /dev/null
+++ b/tests/integration/components/identity/blocked.js
@@ -0,0 +1,26 @@
+import { module, test } from 'qunit';
+import { setupRenderingTest } from 'website-www/tests/helpers';
+import { render, click } from '@ember/test-helpers';
+import { hbs } from 'ember-cli-htmlbars';
+
+module('Integration | Component | identity/blocked', function (hooks) {
+ setupRenderingTest(hooks);
+
+ test('it renders the initial state correctly', async function (assert) {
+ await render(hbs``);
+
+ assert.dom('[data-test-blocked-heading]').hasText('Status Blocked');
+ assert.dom('[data-test-blocked-desc]').exists();
+ assert.dom('[data-test-blocked-button]').hasText('Retry');
+ });
+
+ test('it handles retry button click', async function (assert) {
+ let retryClicked = false;
+ this.set('setState', () => (retryClicked = true));
+ await render(hbs``);
+
+ await click('[data-test-blocked-button]');
+
+ assert.true(retryClicked, 'Retry button should trigger setState');
+ });
+});
diff --git a/tests/integration/components/identity/get-started.js b/tests/integration/components/identity/get-started.js
new file mode 100644
index 00000000..05de06db
--- /dev/null
+++ b/tests/integration/components/identity/get-started.js
@@ -0,0 +1,52 @@
+import { module, test } from 'qunit';
+import { setupRenderingTest } from 'website-www/tests/helpers';
+import { render, click } from '@ember/test-helpers';
+import { hbs } from 'ember-cli-htmlbars';
+
+module('Integration | Component | identity/get-started', function (hooks) {
+ setupRenderingTest(hooks);
+
+ test('it renders the get started component correctly', async function (assert) {
+ this.set('setState', () => {});
+ await render(hbs`
+
+ `);
+
+ assert.dom('[data-test-getStarted-heading]').exists();
+ assert
+ .dom('[data-test-getStarted-heading]')
+ .hasText('Qualification Criteria');
+
+ assert.dom('[data-test-getStarted-desc]').exists();
+ assert
+ .dom('[data-test-getStarted-desc]')
+ .containsText('To update your profile details');
+ assert
+ .dom('[data-test-getStarted-desc] a')
+ .hasAttribute(
+ 'href',
+ 'https://github.com/Real-Dev-Squad/sample-profile-service',
+ );
+
+ assert.dom('[data-test-getStarted-button]').exists();
+ assert.dom('[data-test-getStarted-button]').hasText('Get Started');
+ });
+
+ test('clicking get started button triggers setState action with step1', async function (assert) {
+ assert.expect(1);
+
+ this.set('setState', (state) => {
+ assert.strictEqual(
+ state,
+ 'step1',
+ 'setState action is called with step1',
+ );
+ });
+
+ await render(hbs`
+
+ `);
+
+ await click('[data-test-getStarted-button]');
+ });
+});
diff --git a/tests/integration/components/identity/step1.js b/tests/integration/components/identity/step1.js
new file mode 100644
index 00000000..197c5b4b
--- /dev/null
+++ b/tests/integration/components/identity/step1.js
@@ -0,0 +1,71 @@
+import { module, test } from 'qunit';
+import { setupRenderingTest } from 'website-www/tests/helpers';
+import { render, click, waitFor } from '@ember/test-helpers';
+import { hbs } from 'ember-cli-htmlbars';
+
+module('Integration | Component | identity/step1', function (hooks) {
+ setupRenderingTest(hooks);
+
+ test('it renders the initial state correctly', async function (assert) {
+ this.set('setState', () => {});
+ await render(hbs``);
+
+ assert
+ .dom('[data-test-step1-heading]')
+ .hasText('Step 1: Chaincode Generation');
+ assert.dom('[data-test-step1-desc]').exists();
+ assert.dom('[data-test-step1-button]').hasText('Generate Chaincode');
+ assert.dom('[data-test-step1-next-button]').doesNotExist();
+ });
+
+ test('it handles chaincode generation', async function (assert) {
+ this.set('setState', () => {});
+ await render(hbs``);
+
+ await click('[data-test-step1-button]');
+ await waitFor('.identity-chaincode-box');
+
+ assert.dom('[data-test-step1-chaincode]').hasText('********************');
+ assert.dom('[data-test-step1-next-button]').exists();
+ assert.dom('[data-test-step1-button]').doesNotExist();
+ });
+
+ test('it toggles chaincode visibility', async function (assert) {
+ this.set('setState', () => {});
+ await render(hbs``);
+
+ await click('[data-test-step1-button]');
+ await waitFor('.identity-chaincode-box');
+
+ const initialText = await document
+ .querySelector('[data-test-step1-chaincode]')
+ .textContent.trim();
+ await click('[data-test-step1-eye]');
+ const visibleText = await document
+ .querySelector('[data-test-step1-chaincode]')
+ .textContent.trim();
+
+ assert.notEqual(
+ initialText,
+ visibleText,
+ 'Chaincode visibility should toggle',
+ );
+ assert.notEqual(
+ visibleText,
+ '********************',
+ 'Chaincode should be visible',
+ );
+ });
+
+ test('it handles next button click', async function (assert) {
+ let nextClicked = false;
+ this.set('setState', () => (nextClicked = true));
+ await render(hbs``);
+
+ await click('[data-test-step1-button]');
+ await waitFor('[data-test-step1-next-button]');
+ await click('[data-test-step1-next-button]');
+
+ assert.true(nextClicked, 'Next button should trigger setState');
+ });
+});
diff --git a/tests/integration/components/identity/step2.js b/tests/integration/components/identity/step2.js
new file mode 100644
index 00000000..68b90ad6
--- /dev/null
+++ b/tests/integration/components/identity/step2.js
@@ -0,0 +1,74 @@
+import { module, test } from 'qunit';
+import { setupRenderingTest } from 'website-www/tests/helpers';
+import { render, click, fillIn } from '@ember/test-helpers';
+import { hbs } from 'ember-cli-htmlbars';
+
+module('Integration | Component | identity/step2', function (hooks) {
+ setupRenderingTest(hooks);
+
+ test('it renders the initial state correctly', async function (assert) {
+ this.set('setState', () => {});
+ this.set('profileURL', '');
+ await render(
+ hbs``,
+ );
+
+ assert
+ .dom('[data-test-step2-heading]')
+ .hasText('Step 2: Profile Service URL');
+ assert.dom('[data-test-step2-desc]').exists();
+ assert.dom('[data-test-step2-input]').exists();
+ assert.dom('[data-test-step2-next-button]').doesNotExist();
+ });
+
+ test('it shows next button when URL is entered', async function (assert) {
+ this.set('setState', () => {});
+ this.set('profileURL', '');
+ await render(
+ hbs``,
+ );
+
+ assert.dom('[data-test-step2-next-button]').doesNotExist();
+
+ await fillIn('[data-test-step2-input]', 'https://my-profile-service.com');
+
+ assert.dom('[data-test-step2-next-button]').exists();
+ assert.dom('[data-test-step2-next-button]').hasText('Next');
+ });
+
+ test('it handles next button click and shows loader', async function (assert) {
+ let nextClicked = false;
+ this.set('setState', () => (nextClicked = true));
+ this.set('profileURL', '');
+ await render(
+ hbs``,
+ );
+
+ await fillIn('[data-test-step2-input]', 'https://my-profile-service.com');
+ await click('[data-test-step2-next-button]');
+
+ assert.true(nextClicked, 'Next button should trigger setState');
+ });
+
+ test('it shows loader while saving URL', async function (assert) {
+ this.set('setState', () => {});
+ this.set('savingURL', true);
+ this.set('profileURL', '');
+ await render(hbs`
+ `);
+
+ await fillIn('[data-test-step2-input]', 'https://my-profile-service.com');
+
+ assert.dom('.loader').exists('Loader should be visible when saving');
+ assert
+ .dom('[data-test-step2-next-button]')
+ .doesNotContainText(
+ 'Next',
+ 'Next text should not be visible while loading',
+ );
+ });
+});
diff --git a/tests/integration/components/identity/step3.js b/tests/integration/components/identity/step3.js
new file mode 100644
index 00000000..2357d921
--- /dev/null
+++ b/tests/integration/components/identity/step3.js
@@ -0,0 +1,41 @@
+import { module, test } from 'qunit';
+import { setupRenderingTest } from 'website-www/tests/helpers';
+import { render, click } from '@ember/test-helpers';
+import { hbs } from 'ember-cli-htmlbars';
+
+module('Integration | Component | identity/step3', function (hooks) {
+ setupRenderingTest(hooks);
+
+ test('it renders the initial state correctly', async function (assert) {
+ await render(hbs``);
+
+ assert
+ .dom('[data-test-step3-heading]')
+ .hasText('Step 3: Link Profile Service');
+ assert.dom('[data-test-step3-desc]').exists();
+ assert.dom('[data-test-step3-button]').hasText('Link');
+ });
+
+ test('it shows loader while linking', async function (assert) {
+ this.set('linking', true);
+ await render(hbs``);
+
+ assert.dom('.loader').exists('Loader should be visible when linking');
+ assert
+ .dom('[data-test-step3-button]')
+ .doesNotContainText(
+ 'Link',
+ 'Link text should not be visible while loading',
+ );
+ });
+
+ test('it handles link button click', async function (assert) {
+ let linkClicked = false;
+ this.set('handleLink', () => (linkClicked = true));
+ await render(hbs``);
+
+ await click('[data-test-step3-button]');
+
+ assert.true(linkClicked, 'Link button should trigger handleLink action');
+ });
+});
diff --git a/tests/integration/components/identity/verified.js b/tests/integration/components/identity/verified.js
new file mode 100644
index 00000000..da908c34
--- /dev/null
+++ b/tests/integration/components/identity/verified.js
@@ -0,0 +1,19 @@
+import { module, test } from 'qunit';
+import { setupRenderingTest } from 'website-www/tests/helpers';
+import { render } from '@ember/test-helpers';
+import { hbs } from 'ember-cli-htmlbars';
+
+module('Integration | Component | identity/verified', function (hooks) {
+ setupRenderingTest(hooks);
+
+ test('it renders the success message correctly', async function (assert) {
+ await render(hbs``);
+
+ assert.dom('[data-test-verified-heading]').hasText('Verified');
+ assert.dom('[data-test-verified-desc]').exists();
+ assert
+ .dom('[data-test-verified-desc] span')
+ .hasClass('identity-box-desc-bold');
+ assert.dom('[data-test-verified-desc] span').hasText('Congratulations!!!');
+ });
+});