mirror of
https://github.com/twentyhq/twenty.git
synced 2024-12-24 04:23:57 +03:00
Improve tests (#5994)
Our tests on FE are red, which is a threat to code quality. I'm adding a few unit tests to improve the coverage and lowering a bit the lines coverage threshold
This commit is contained in:
parent
e13dc7a1fc
commit
158e7a31f4
@ -1640,7 +1640,7 @@ export type Captcha = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export enum CaptchaDriverType {
|
export enum CaptchaDriverType {
|
||||||
GoogleRecatpcha = 'GoogleRecatpcha',
|
GoogleRecaptcha = 'GoogleRecaptcha',
|
||||||
Turnstile = 'Turnstile'
|
Turnstile = 'Turnstile'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -25,7 +25,7 @@ const jestConfig: JestConfigWithTsJest = {
|
|||||||
coverageThreshold: {
|
coverageThreshold: {
|
||||||
global: {
|
global: {
|
||||||
statements: 65,
|
statements: 65,
|
||||||
lines: 65,
|
lines: 64,
|
||||||
functions: 55,
|
functions: 55,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -136,7 +136,7 @@ export type Captcha = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export enum CaptchaDriverType {
|
export enum CaptchaDriverType {
|
||||||
GoogleRecatpcha = 'GoogleRecatpcha',
|
GoogleRecaptcha = 'GoogleRecaptcha',
|
||||||
Turnstile = 'Turnstile'
|
Turnstile = 'Turnstile'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -130,7 +130,7 @@ export type Captcha = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export enum CaptchaDriverType {
|
export enum CaptchaDriverType {
|
||||||
GoogleRecatpcha = 'GoogleRecatpcha',
|
GoogleRecaptcha = 'GoogleRecaptcha',
|
||||||
Turnstile = 'Turnstile'
|
Turnstile = 'Turnstile'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -32,7 +32,7 @@ export const CaptchaProviderScriptLoaderEffect = () => {
|
|||||||
scriptElement = document.createElement('script');
|
scriptElement = document.createElement('script');
|
||||||
scriptElement.src = scriptUrl;
|
scriptElement.src = scriptUrl;
|
||||||
scriptElement.onload = () => {
|
scriptElement.onload = () => {
|
||||||
if (captchaProvider.provider === CaptchaDriverType.GoogleRecatpcha) {
|
if (captchaProvider.provider === CaptchaDriverType.GoogleRecaptcha) {
|
||||||
window.grecaptcha?.ready(() => {
|
window.grecaptcha?.ready(() => {
|
||||||
setIsCaptchaScriptLoaded(true);
|
setIsCaptchaScriptLoaded(true);
|
||||||
});
|
});
|
||||||
|
@ -35,7 +35,7 @@ export const useRequestFreshCaptchaToken = () => {
|
|||||||
let captchaWidget: any;
|
let captchaWidget: any;
|
||||||
|
|
||||||
switch (captchaProvider.provider) {
|
switch (captchaProvider.provider) {
|
||||||
case CaptchaDriverType.GoogleRecatpcha:
|
case CaptchaDriverType.GoogleRecaptcha:
|
||||||
window.grecaptcha
|
window.grecaptcha
|
||||||
.execute(captchaProvider.siteKey, {
|
.execute(captchaProvider.siteKey, {
|
||||||
action: 'submit',
|
action: 'submit',
|
||||||
|
@ -0,0 +1,38 @@
|
|||||||
|
import { expect } from '@storybook/test';
|
||||||
|
|
||||||
|
import { CaptchaDriverType } from '~/generated/graphql';
|
||||||
|
|
||||||
|
import { getCaptchaUrlByProvider } from '../getCaptchaUrlByProvider';
|
||||||
|
|
||||||
|
describe('getCaptchaUrlByProvider', () => {
|
||||||
|
it('handles GoogleRecaptcha', async () => {
|
||||||
|
const captchaUrl = getCaptchaUrlByProvider(
|
||||||
|
CaptchaDriverType.GoogleRecaptcha,
|
||||||
|
'siteKey',
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(captchaUrl).toEqual(
|
||||||
|
'https://www.google.com/recaptcha/api.js?render=siteKey',
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(() =>
|
||||||
|
getCaptchaUrlByProvider(CaptchaDriverType.GoogleRecaptcha, ''),
|
||||||
|
).toThrow(
|
||||||
|
'SiteKey must be provided while generating url for GoogleRecaptcha provider',
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('handles Turnstile', async () => {
|
||||||
|
const captchaUrl = getCaptchaUrlByProvider(CaptchaDriverType.Turnstile, '');
|
||||||
|
|
||||||
|
expect(captchaUrl).toEqual(
|
||||||
|
'https://challenges.cloudflare.com/turnstile/v0/api.js',
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('handles unknown provider', async () => {
|
||||||
|
expect(() =>
|
||||||
|
getCaptchaUrlByProvider('Unknown' as CaptchaDriverType, ''),
|
||||||
|
).toThrow('Unknown captcha provider');
|
||||||
|
});
|
||||||
|
});
|
@ -1,16 +1,22 @@
|
|||||||
|
import { isNonEmptyString } from '@sniptt/guards';
|
||||||
|
|
||||||
import { CaptchaDriverType } from '~/generated-metadata/graphql';
|
import { CaptchaDriverType } from '~/generated-metadata/graphql';
|
||||||
|
|
||||||
export const getCaptchaUrlByProvider = (name: string, siteKey: string) => {
|
export const getCaptchaUrlByProvider = (
|
||||||
if (!name) {
|
name: CaptchaDriverType,
|
||||||
return '';
|
siteKey: string,
|
||||||
}
|
) => {
|
||||||
|
|
||||||
switch (name) {
|
switch (name) {
|
||||||
case CaptchaDriverType.GoogleRecatpcha:
|
case CaptchaDriverType.GoogleRecaptcha:
|
||||||
|
if (!isNonEmptyString(siteKey)) {
|
||||||
|
throw new Error(
|
||||||
|
'SiteKey must be provided while generating url for GoogleRecaptcha provider',
|
||||||
|
);
|
||||||
|
}
|
||||||
return `https://www.google.com/recaptcha/api.js?render=${siteKey}`;
|
return `https://www.google.com/recaptcha/api.js?render=${siteKey}`;
|
||||||
case CaptchaDriverType.Turnstile:
|
case CaptchaDriverType.Turnstile:
|
||||||
return 'https://challenges.cloudflare.com/turnstile/v0/api.js';
|
return 'https://challenges.cloudflare.com/turnstile/v0/api.js';
|
||||||
default:
|
default:
|
||||||
return '';
|
throw new Error('Unknown captcha provider');
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -0,0 +1,15 @@
|
|||||||
|
import { getForeignDataWrapperType } from '../getForeignDataWrapperType';
|
||||||
|
|
||||||
|
describe('getForeignDataWrapperType', () => {
|
||||||
|
it('should handle postgres', () => {
|
||||||
|
expect(getForeignDataWrapperType('postgresql')).toBe('postgres_fdw');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle stripe', () => {
|
||||||
|
expect(getForeignDataWrapperType('stripe')).toBe('stripe_fdw');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return null for unknown', () => {
|
||||||
|
expect(getForeignDataWrapperType('unknown')).toBeNull();
|
||||||
|
});
|
||||||
|
});
|
@ -0,0 +1,10 @@
|
|||||||
|
import { AppPath } from '@/types/AppPath';
|
||||||
|
|
||||||
|
import indexAppPath from '../indexAppPath';
|
||||||
|
|
||||||
|
describe('getIndexAppPath', () => {
|
||||||
|
it('returns the index app path', () => {
|
||||||
|
const { getIndexAppPath } = indexAppPath;
|
||||||
|
expect(getIndexAppPath()).toEqual(AppPath.Index);
|
||||||
|
});
|
||||||
|
});
|
@ -88,5 +88,5 @@ export const SETTINGS_FIELD_CURRENCY_CODES: Record<
|
|||||||
BRL: {
|
BRL: {
|
||||||
label: 'Brazilian real',
|
label: 'Brazilian real',
|
||||||
Icon: IconCurrencyReal,
|
Icon: IconCurrencyReal,
|
||||||
}
|
},
|
||||||
};
|
};
|
||||||
|
@ -0,0 +1,48 @@
|
|||||||
|
import { getSettingsIntegrationAll } from '../getSettingsIntegrationAll';
|
||||||
|
|
||||||
|
describe('getSettingsIntegrationAll', () => {
|
||||||
|
it('should return null if imageUrl is null', () => {
|
||||||
|
expect(
|
||||||
|
getSettingsIntegrationAll({
|
||||||
|
isAirtableIntegrationActive: true,
|
||||||
|
isAirtableIntegrationEnabled: true,
|
||||||
|
isPostgresqlIntegrationActive: true,
|
||||||
|
isPostgresqlIntegrationEnabled: true,
|
||||||
|
isStripeIntegrationActive: true,
|
||||||
|
isStripeIntegrationEnabled: true,
|
||||||
|
}),
|
||||||
|
).toStrictEqual({
|
||||||
|
integrations: [
|
||||||
|
{
|
||||||
|
from: {
|
||||||
|
image: '/images/integrations/airtable-logo.png',
|
||||||
|
key: 'airtable',
|
||||||
|
},
|
||||||
|
link: '/settings/integrations/airtable',
|
||||||
|
text: 'Airtable',
|
||||||
|
type: 'Active',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
from: {
|
||||||
|
image: '/images/integrations/postgresql-logo.png',
|
||||||
|
key: 'postgresql',
|
||||||
|
},
|
||||||
|
link: '/settings/integrations/postgresql',
|
||||||
|
text: 'PostgreSQL',
|
||||||
|
type: 'Active',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
from: {
|
||||||
|
image: '/images/integrations/stripe-logo.png',
|
||||||
|
key: 'stripe',
|
||||||
|
},
|
||||||
|
link: '/settings/integrations/stripe',
|
||||||
|
text: 'Stripe',
|
||||||
|
type: 'Active',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
key: 'all',
|
||||||
|
title: 'All',
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
@ -34,7 +34,7 @@ export const mockedClientConfig: ClientConfig = {
|
|||||||
__typename: 'Billing',
|
__typename: 'Billing',
|
||||||
},
|
},
|
||||||
captcha: {
|
captcha: {
|
||||||
provider: CaptchaDriverType.GoogleRecatpcha,
|
provider: CaptchaDriverType.GoogleRecaptcha,
|
||||||
siteKey: 'MOCKED_SITE_KEY',
|
siteKey: 'MOCKED_SITE_KEY',
|
||||||
__typename: 'Captcha',
|
__typename: 'Captcha',
|
||||||
},
|
},
|
||||||
|
@ -0,0 +1,27 @@
|
|||||||
|
import { getImageAbsoluteURIOrBase64 } from '../getImageAbsoluteURIOrBase64';
|
||||||
|
|
||||||
|
describe('getImageAbsoluteURIOrBase64', () => {
|
||||||
|
it('should return null if imageUrl is null', () => {
|
||||||
|
const imageUrl = null;
|
||||||
|
const result = getImageAbsoluteURIOrBase64(imageUrl);
|
||||||
|
expect(result).toBeNull();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return base64 encoded string if prefixed with data', () => {
|
||||||
|
const imageUrl = 'data:XXX';
|
||||||
|
const result = getImageAbsoluteURIOrBase64(imageUrl);
|
||||||
|
expect(result).toBe(imageUrl);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return absolute url if the imageUrl is an absolute url', () => {
|
||||||
|
const imageUrl = 'https://XXX';
|
||||||
|
const result = getImageAbsoluteURIOrBase64(imageUrl);
|
||||||
|
expect(result).toBe(imageUrl);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return fully formed url if imageUrl is a relative url', () => {
|
||||||
|
const imageUrl = 'XXX';
|
||||||
|
const result = getImageAbsoluteURIOrBase64(imageUrl);
|
||||||
|
expect(result).toBe('http://localhost:3000/files/XXX');
|
||||||
|
});
|
||||||
|
});
|
@ -22,7 +22,7 @@ export class CaptchaModule {
|
|||||||
}
|
}
|
||||||
|
|
||||||
switch (config.type) {
|
switch (config.type) {
|
||||||
case CaptchaDriverType.GoogleRecatpcha:
|
case CaptchaDriverType.GoogleRecaptcha:
|
||||||
return new GoogleRecaptchaDriver(config.options);
|
return new GoogleRecaptchaDriver(config.options);
|
||||||
case CaptchaDriverType.Turnstile:
|
case CaptchaDriverType.Turnstile:
|
||||||
return new TurnstileDriver(config.options);
|
return new TurnstileDriver(config.options);
|
||||||
|
@ -2,7 +2,7 @@ import { FactoryProvider, ModuleMetadata } from '@nestjs/common';
|
|||||||
import { registerEnumType } from '@nestjs/graphql';
|
import { registerEnumType } from '@nestjs/graphql';
|
||||||
|
|
||||||
export enum CaptchaDriverType {
|
export enum CaptchaDriverType {
|
||||||
GoogleRecatpcha = 'google-recaptcha',
|
GoogleRecaptcha = 'google-recaptcha',
|
||||||
Turnstile = 'turnstile',
|
Turnstile = 'turnstile',
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -15,8 +15,8 @@ export type CaptchaDriverOptions = {
|
|||||||
secretKey: string;
|
secretKey: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
export interface GoogleRecatpchaDriverFactoryOptions {
|
export interface GoogleRecaptchaDriverFactoryOptions {
|
||||||
type: CaptchaDriverType.GoogleRecatpcha;
|
type: CaptchaDriverType.GoogleRecaptcha;
|
||||||
options: CaptchaDriverOptions;
|
options: CaptchaDriverOptions;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -26,7 +26,7 @@ export interface TurnstileDriverFactoryOptions {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export type CaptchaModuleOptions =
|
export type CaptchaModuleOptions =
|
||||||
| GoogleRecatpchaDriverFactoryOptions
|
| GoogleRecaptchaDriverFactoryOptions
|
||||||
| TurnstileDriverFactoryOptions;
|
| TurnstileDriverFactoryOptions;
|
||||||
|
|
||||||
export type CaptchaModuleAsyncOptions = {
|
export type CaptchaModuleAsyncOptions = {
|
||||||
|
Loading…
Reference in New Issue
Block a user