1
0
mirror of https://github.com/sasjs/adapter.git synced 2026-01-12 22:50:06 +00:00

feat(auth): added utils to get and check login header

This commit is contained in:
Yury
2024-06-21 11:24:06 +03:00
parent 2cca192f88
commit a90f699abd
11 changed files with 223 additions and 156 deletions

View File

@@ -8,14 +8,15 @@ import { ServerType } from '@sasjs/utils/types'
import axios from 'axios'
import {
mockedCurrentUserApi,
mockLoginAuthoriseRequiredResponse,
mockLoginSuccessResponse
mockLoginAuthoriseRequiredResponse
} from './mockResponses'
import { serialize } from '../../utils'
import * as openWebPageModule from '../openWebPage'
import * as verifySasViyaLoginModule from '../verifySasViyaLogin'
import * as verifySas9LoginModule from '../verifySas9Login'
import { RequestClient } from '../../request/RequestClient'
import { getExpectedLogInSuccessHeader } from '../'
jest.mock('axios')
const mockedAxios = axios as jest.Mocked<typeof axios>
@@ -135,6 +136,7 @@ describe('AuthManager', () => {
requestClient,
authCallback
)
jest.spyOn(authManager, 'checkSession').mockImplementation(() =>
Promise.resolve({
isLoggedIn: false,
@@ -143,8 +145,9 @@ describe('AuthManager', () => {
loginForm: { name: 'test' }
})
)
mockedAxios.post.mockImplementation(() =>
Promise.resolve({ data: mockLoginSuccessResponse })
Promise.resolve({ data: getExpectedLogInSuccessHeader() })
)
const loginResponse = await authManager.logIn(userName, password)
@@ -180,6 +183,7 @@ describe('AuthManager', () => {
requestClient,
authCallback
)
jest.spyOn(authManager, 'checkSession').mockImplementation(() =>
Promise.resolve({
isLoggedIn: false,
@@ -188,8 +192,9 @@ describe('AuthManager', () => {
loginForm: { name: 'test' }
})
)
mockedAxios.post.mockImplementation(() =>
Promise.resolve({ data: mockLoginSuccessResponse })
Promise.resolve({ data: getExpectedLogInSuccessHeader() })
)
mockedAxios.get.mockImplementation(() => Promise.resolve({ status: 200 }))
@@ -304,56 +309,6 @@ describe('AuthManager', () => {
mockLoginAuthoriseRequiredResponse
)
})
it('should check login success header based on language preferences of the browser', () => {
const authManager = new AuthManager(
serverUrl,
serverType,
requestClient,
authCallback
)
// test built in language codes
Object.keys(authManager['successHeaders']).forEach((key) => {
languageGetter.mockReturnValue(key)
expect(
authManager['isLogInSuccessHeaderPresent'](
serverType,
authManager['successHeaders'][key]
)
).toBeTruthy()
})
// test possible longer language codes
const possibleLanguageCodes = [
{ short: 'en', long: 'en-US' },
{ short: 'fr', long: 'fr-FR' },
{ short: 'es', long: 'es-ES' }
]
possibleLanguageCodes.forEach((key) => {
const { short, long } = key
languageGetter.mockReturnValue(long)
expect(
authManager['isLogInSuccessHeaderPresent'](
serverType,
authManager['successHeaders'][short]
)
).toBeTruthy()
})
// test falling back to default language code
languageGetter.mockReturnValue('WRONG-LANGUAGE')
expect(
authManager['isLogInSuccessHeaderPresent'](
serverType,
authManager['successHeaders'][authManager['defaultSuccessHeaderKey']]
)
).toBeTruthy()
})
})
describe('login - redirect mechanism', () => {

View File

@@ -0,0 +1,82 @@
/**
* @jest-environment jsdom
*/
import { ServerType } from '@sasjs/utils/types'
import {
loginSuccessHeaders,
isLogInSuccessHeaderPresent,
defaultSuccessHeaderKey
} from '../'
describe('isLogInSuccessHeaderPresent', () => {
let languageGetter: any
beforeEach(() => {
languageGetter = jest.spyOn(window.navigator, 'language', 'get')
})
it('should check SASVIYA and SAS9 login success header based on language preferences of the browser', () => {
// test SASVIYA server type
Object.keys(loginSuccessHeaders).forEach((key) => {
languageGetter.mockReturnValue(key)
expect(
isLogInSuccessHeaderPresent(
ServerType.SasViya,
loginSuccessHeaders[key]
)
).toBeTruthy()
})
// test SAS9 server type
Object.keys(loginSuccessHeaders).forEach((key) => {
languageGetter.mockReturnValue(key)
expect(
isLogInSuccessHeaderPresent(ServerType.Sas9, loginSuccessHeaders[key])
).toBeTruthy()
})
// test possible longer language codes
const possibleLanguageCodes = [
{ short: 'en', long: 'en-US' },
{ short: 'fr', long: 'fr-FR' },
{ short: 'es', long: 'es-ES' }
]
possibleLanguageCodes.forEach((key) => {
const { short, long } = key
languageGetter.mockReturnValue(long)
expect(
isLogInSuccessHeaderPresent(
ServerType.SasViya,
loginSuccessHeaders[short]
)
).toBeTruthy()
})
// test falling back to default language code
languageGetter.mockReturnValue('WRONG-LANGUAGE')
expect(
isLogInSuccessHeaderPresent(
ServerType.Sas9,
loginSuccessHeaders[defaultSuccessHeaderKey]
)
).toBeTruthy()
})
it('should check SASVJS login success header', () => {
expect(
isLogInSuccessHeaderPresent(ServerType.Sasjs, { loggedIn: true })
).toBeTruthy()
expect(
isLogInSuccessHeaderPresent(ServerType.Sasjs, { loggedIn: false })
).toBeFalsy()
expect(isLogInSuccessHeaderPresent(ServerType.Sasjs, undefined)).toBeFalsy()
})
})

View File

@@ -1,8 +1,6 @@
import { SasAuthResponse } from '@sasjs/utils/types'
import { enLoginSuccessHeader } from '../AuthManager'
export const mockLoginAuthoriseRequiredResponse = `<form id="application_authorization" action="/SASLogon/oauth/authorize" method="POST"><input type="hidden" name="X-Uaa-Csrf" value="2nfuxIn6WaOURWL7tzTXCe"/>`
export const mockLoginSuccessResponse = enLoginSuccessHeader
export const mockAuthResponse: SasAuthResponse = {
access_token: 'acc355',

View File

@@ -3,7 +3,7 @@
*/
import { verifySas9Login } from '../verifySas9Login'
import * as delayModule from '../../utils/delay'
import { enLoginSuccessHeader } from '../AuthManager'
import { getExpectedLogInSuccessHeader } from '../'
describe('verifySas9Login', () => {
const serverUrl = 'http://test-server.com'
@@ -19,7 +19,9 @@ describe('verifySas9Login', () => {
const popup = {
window: {
location: { href: serverUrl + `/SASLogon` },
document: { body: { innerText: `<h3>${enLoginSuccessHeader}</h3>` } }
document: {
body: { innerText: `<h3>${getExpectedLogInSuccessHeader()}</h3>` }
}
}
} as unknown as Window

View File

@@ -3,7 +3,7 @@
*/
import { verifySasViyaLogin } from '../verifySasViyaLogin'
import * as delayModule from '../../utils/delay'
import { enLoginSuccessHeader } from '../AuthManager'
import { getExpectedLogInSuccessHeader } from '../'
describe('verifySasViyaLogin', () => {
const serverUrl = 'http://test-server.com'
@@ -20,7 +20,9 @@ describe('verifySasViyaLogin', () => {
const popup = {
window: {
location: { href: serverUrl + `/SASLogon` },
document: { body: { innerText: `<h3>${enLoginSuccessHeader}</h3>` } }
document: {
body: { innerText: `<h3>${getExpectedLogInSuccessHeader()}</h3>` }
}
}
} as unknown as Window