import { CredentialsPage, CredentialsModal } from '../pages';

const credentialsPage = new CredentialsPage();
const credentialsModal = new CredentialsModal();

describe('Credentials', () => {
	it('create and connect with Google OAuth2', () => {
		// Open credentials page
		cy.visit(credentialsPage.url, {
			onBeforeLoad(win) {
				cy.stub(win, 'open').as('windowOpen');
			},
		});

		// Add a new Google OAuth2 credential
		credentialsPage.getters.emptyListCreateCredentialButton().click();
		credentialsModal.getters.newCredentialTypeOption('Google OAuth2 API').click();
		credentialsModal.getters.newCredentialTypeButton().click();

		// Fill in the key/secret and save
		credentialsModal.actions.fillField('clientId', 'test-key');
		credentialsModal.actions.fillField('clientSecret', 'test-secret');
		credentialsModal.actions.save();

		// Connect to Google
		credentialsModal.getters.oauthConnectButton().click();
		cy.get('@windowOpen').should(
			'have.been.calledOnceWith',
			Cypress.sinon.match(
				'https://accounts.google.com/o/oauth2/v2/auth?access_type=offline&prompt=consent&client_id=test-key&redirect_uri=http%3A%2F%2Flocalhost%3A5678%2Frest%2Foauth2-credential%2Fcallback&response_type=code',
			),
			'OAuth Authorization',
			'scrollbars=no,resizable=yes,status=no,titlebar=noe,location=no,toolbar=no,menubar=no,width=500,height=700',
		);

		// Emulate successful save using BroadcastChannel
		cy.window().then(() => {
			const channel = new BroadcastChannel('oauth-callback');
			channel.postMessage('success');
		});

		// Check that the credential was saved and connected successfully
		credentialsModal.getters.saveButton().should('contain.text', 'Saved');
		credentialsModal.getters.oauthConnectSuccessBanner().should('be.visible');
	});
});