Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

evgeniy/ 91778/ remove validation for sequental and repetitive digits idv #8021

Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ import React from 'react';
import { fireEvent, render, screen, waitFor } from '@testing-library/react';
import { isDesktop, isMobile } from '@deriv/shared';
import IdvDocumentSubmit from '../idv-document-submit';
import { isSequentialNumber, isRecurringNumberRegex } from '../utils';

jest.mock('react-router');
jest.mock('Assets/ic-document-submit-icon.svg', () => jest.fn(() => 'DocumentSubmitLogo'));
Expand All @@ -25,9 +24,6 @@ jest.mock('../utils.js', () => ({
return data[country_code][key];
},
getRegex: jest.fn(() => /5436454364243/i),
isSequentialNumber: jest.fn(() => false),
isRecurringNumberRegex: jest.fn(() => false),
isIDVWhitelistDocumentNumber: jest.fn(() => false),
}));

jest.mock('@deriv/shared', () => ({
Expand Down Expand Up @@ -104,54 +100,9 @@ describe('<IdvDocumentSubmit/>', () => {
});
});

it('should not allow users to fill in repetitive document numbers', async () => {
//invalid document number- error should be shown
isDesktop.mockReturnValue(false);
isMobile.mockReturnValue(true);
isSequentialNumber.mockReturnValue(true);
isRecurringNumberRegex.mockReturnValue(true);

const selected_doc_msg =
'Please ensure all your personal details are the same as in your chosen document. If you wish to update your personal details, go to account settings.';

render(<IdvDocumentSubmit {...mock_props} />);

const verifyBtn = screen.getByRole('button', { name: /verify/i });
expect(verifyBtn).toBeDisabled();

const document_type_input = screen.getByRole('combobox');
expect(document_type_input.name).toBe('document_type');
const document_number_input = screen.getByPlaceholderText('Enter your document number');
expect(document_number_input.name).toBe('document_number');
expect(document_number_input).toBeDisabled();
expect(screen.queryByText(selected_doc_msg)).not.toBeInTheDocument();

fireEvent.change(document_type_input, { target: { value: 'Test document 2 name' } });
expect(document_number_input).not.toBeDisabled();
expect(screen.getByText(selected_doc_msg)).toBeInTheDocument();

fireEvent.blur(document_number_input);
expect(await screen.findByText(/please enter your document number/i)).toBeInTheDocument();

Object.defineProperty(window, 'location', {
get() {
return { hash: '#toggle_id_validation' };
},
});

fireEvent.keyUp(document_number_input);
fireEvent.change(document_number_input, { target: { value: 'A-54321' } });
expect(await screen.findByText(/please enter a valid ID number/i)).toBeInTheDocument();

fireEvent.change(document_number_input, { target: { value: '111112' } });
expect(await screen.findByText(/please enter a valid ID number/i)).toBeInTheDocument();
});

it('should change inputs, check document_number validation and trigger "Verify" button after rendering IdvDocumentSubmit component', async () => {
isDesktop.mockReturnValue(false);
isMobile.mockReturnValue(true);
isSequentialNumber.mockReturnValue(false);
isRecurringNumberRegex.mockReturnValue(false);

const selected_doc_msg =
'Please ensure all your personal details are the same as in your chosen document. If you wish to update your personal details, go to account settings.';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,7 @@ import { Autocomplete, Button, DesktopWrapper, Input, MobileWrapper, Text, Selec
import { Formik, Field } from 'formik';
import { localize, Localize } from '@deriv/translations';
import { formatInput, WS } from '@deriv/shared';
import {
documentAdditionalError,
getDocumentData,
getRegex,
isRecurringNumberRegex,
isSequentialNumber,
preventEmptyClipboardPaste,
isIDVWhitelistDocumentNumber,
} from './utils';
import { documentAdditionalError, getDocumentData, getRegex, preventEmptyClipboardPaste } from './utils';
import FormFooter from 'Components/form-footer';
import BackButtonIcon from 'Assets/ic-poi-back-btn.svg';
import DocumentSubmitLogo from 'Assets/ic-document-submit-icon.svg';
Expand Down Expand Up @@ -112,17 +104,8 @@ const IdvDocumentSubmit = ({ handleBack, handleViewComplete, selected_country, i
const validateFields = values => {
const errors = {};
const { document_type, document_number, document_additional } = values;
const is_sequential_number = isSequentialNumber(document_number);
const is_recurring_number = isRecurringNumberRegex(document_number);
const needs_additional_document = !!document_type.additional;
const is_idv_whitelist_document_number = isIDVWhitelistDocumentNumber(
country_code,
document_type.id,
document_number
);
const is_document_number_invalid =
(!is_idv_whitelist_document_number && (is_recurring_number || is_sequential_number)) ||
document_number === document_type.example_format;
const is_document_number_invalid = document_number === document_type.example_format;

if (!document_type || !document_type.text || !document_type.value) {
errors.document_type = localize('Please select a document type.');
Expand Down
Original file line number Diff line number Diff line change
@@ -1,25 +1,4 @@
import { getPlatformFromUrl, getUrlBase } from '@deriv/shared';

const PATTERN_SIZE = 5;

export const isRecurringNumberRegex = document_number => document_number.replace(/[.-]*/g, '').match(/([0-9])\1{4,}/g);

const createDocumentPatterns = () => {
const ID_PATTERN = '0123456789';
const STEPS = 5; // Steps start at 0
const reverse_pattern = ID_PATTERN.split('').reverse().join('');
const pattern_array = [];

for (let step = 0; step < STEPS; step++) {
const pattern_end = PATTERN_SIZE + step;
pattern_array.push(ID_PATTERN.substring(step, pattern_end));

// Reverse version of the pattern, example: 9876543210
pattern_array.push(reverse_pattern.substring(step, pattern_end));
}

return pattern_array;
};
import { getUrlBase } from '@deriv/shared';

export const documentAdditionalError = (document_additional, document_additional_format) => {
let error_message = null;
Expand All @@ -35,28 +14,6 @@ export const documentAdditionalError = (document_additional, document_additional
return error_message;
};

export const isSequentialNumber = document_number => {
const trimmed_document_number = document_number.replace(/[.-]*/g, '');
const pattern_results = [];

if (document_number.length >= PATTERN_SIZE) {
createDocumentPatterns().forEach(pattern => {
pattern_results.push(trimmed_document_number.includes(pattern));
});
}

return pattern_results.includes(true);
};

// function for skipping validation of exact document numbers for QA smileidentity sandbox testing
export const isIDVWhitelistDocumentNumber = (country, document_type, document_number) => {
const is_whitelisted_number =
idv_test_document_whitelist.has(country) &&
idv_test_document_whitelist.get(country)[document_type] === document_number;

return is_whitelisted_number && (getPlatformFromUrl().is_test_link || getPlatformFromUrl().is_staging);
};

export const getRegex = target_regex => {
const output_regex = regex.find(r => r.regex_string === target_regex);
if (output_regex) {
Expand Down Expand Up @@ -215,10 +172,3 @@ const idv_document_data = {
},
},
};

export const idv_test_document_whitelist = new Map([
['gh', { drivers_license: 'B0000000', passport: 'G0000000', ssnit: 'C000000000000', voter_id: '0000000000' }],
['ke', { alien_card: '000000', passport: 'A00000000', national_id: '00000000' }],
['ng', { drivers_license: 'ABC000000000', nin_slip: '00000000000', voter_id: '0000000000000000000' }],
['za', { national_id: '0000000000000', national_id_no_photo: '0000000000000' }],
]);
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,7 @@ import {
documentAdditionalError,
getDocumentData,
getRegex,
isRecurringNumberRegex,
isSequentialNumber,
preventEmptyClipboardPaste,
isIDVWhitelistDocumentNumber,
} from '../../idv-document-submit/utils';
import DocumentSubmitLogo from 'Assets/ic-document-submit-icon.svg';

Expand Down Expand Up @@ -94,17 +91,8 @@ export const IdvDocSubmitOnSignup = ({ citizen_data, has_previous, onPrevious, o
const validateFields = values => {
const errors = {};
const { document_type, document_number, document_additional } = values;
const is_sequential_number = isSequentialNumber(document_number);
const is_recurring_number = isRecurringNumberRegex(document_number);
const needs_additional_document = !!document_type.additional;
const is_idv_whitelist_document_number = isIDVWhitelistDocumentNumber(
country_code,
document_type.id,
document_number
);
const is_document_number_invalid =
(!is_idv_whitelist_document_number && (is_recurring_number || is_sequential_number)) ||
document_number === document_type.example_format;
const is_document_number_invalid = document_number === document_type.example_format;

if (!document_type || !document_type.text || !document_type.value) {
errors.document_type = localize('Please select a document type.');
Expand Down