* fix(jwt): update import path for isTokenExpired function to remove file extension * packages/graphql: add slot tests * fix(slots): update error handling for customer and slot retrieval, enhance time validation in slot updates * fix(slots): update error messages for missing datetime fields and improve validation logic in slot updates * fix(slots): update error messages and validation logic for slot creation and updates, including handling of datetime fields and master status * refactor(slots): rename checkUpdateIsTimeChanging to checkUpdateDatetime for clarity in slot update validation * test(slots): add comprehensive tests for getAvailableTimeSlots method, including edge cases and error handling * fix(api): standardize error messages for customer and slot retrieval, and improve validation logic in slots service * refactor(slots): rename validation methods for clarity and consistency in slot service * OrdersService: add checkBeforeCreate * add orders.test.js * test(orders): add validation test for missing datetime_end in order creation * feat(orders): implement updateOrder functionality with comprehensive validation tests - Added updateOrder method in OrdersService with checks for permissions, order state, and datetime validation. - Implemented tests for various scenarios including successful updates, permission errors, and validation failures. - Enhanced error handling for overlapping time and invalid state changes. - Updated GraphQL operations to support sorting in GetOrders query. * fix(orders): update datetime validation logic and test cases for order creation and completion - Modified order creation tests to set datetime_start to one hour in the past for past orders. - Updated the OrdersService to use isNowOrAfter for validating order completion against the start time. - Enhanced datetime utility function to accept a unit parameter for more flexible comparisons. * fix(calendar): initialize selected date in ScheduleCalendar component if not set - Added useEffect to set the selected date to the current date if it is not already defined. - Imported useEffect alongside useState for managing component lifecycle. * fix(order-form): initialize selected date in DateSelect component if not set - Added useEffect to set the selected date to the current date if it is not already defined. - Renamed setDate to setSelectedDate for clarity in state management. * refactor(orders): streamline order creation logic and enhance test setup - Removed redundant variable assignments in the createOrder method for cleaner code. - Updated test setup in orders.test.js to use global mocks for user and service retrieval, improving test clarity and maintainability. - Added checks for required fields in order creation to ensure data integrity.
62 lines
2.3 KiB
TypeScript
62 lines
2.3 KiB
TypeScript
/* eslint-disable unicorn/consistent-function-scoping */
|
||
import { isTokenExpired } from './jwt';
|
||
import * as jwt from 'jsonwebtoken';
|
||
import { afterEach, describe, expect, it, vi } from 'vitest';
|
||
|
||
describe('isTokenExpired', () => {
|
||
const mockDateNow = (timestamp: number) => {
|
||
vi.spyOn(Date, 'now').mockReturnValue(timestamp);
|
||
};
|
||
|
||
afterEach(() => {
|
||
vi.restoreAllMocks(); // Сбрасываем все моки после каждого теста
|
||
});
|
||
|
||
it('should return true if the token is expired', () => {
|
||
const token = jwt.sign({}, 'secret', { expiresIn: -10 }); // Токен с истекшим временем
|
||
mockDateNow(Date.now());
|
||
|
||
const result = isTokenExpired(token);
|
||
expect(result).toBe(true);
|
||
});
|
||
|
||
it('should return false if the token is not expired', () => {
|
||
const token = jwt.sign({}, 'secret', { expiresIn: 3_600 }); // Токен с временем жизни 1 час
|
||
mockDateNow(Date.now());
|
||
|
||
const result = isTokenExpired(token);
|
||
expect(result).toBe(false);
|
||
});
|
||
|
||
it('should return true if the token will expire within the threshold', () => {
|
||
const threshold = 300; // 5 минут
|
||
const token = jwt.sign({}, 'secret', { expiresIn: threshold - 10 }); // Токен с временем жизни чуть меньше порога
|
||
mockDateNow(Date.now());
|
||
|
||
const result = isTokenExpired(token, threshold);
|
||
expect(result).toBe(true);
|
||
});
|
||
|
||
it('should return false if the token will expire outside the threshold', () => {
|
||
const threshold = 300; // 5 минут
|
||
const token = jwt.sign({}, 'secret', { expiresIn: threshold + 100 }); // Токен с временем жизни больше порога
|
||
mockDateNow(Date.now());
|
||
|
||
const result = isTokenExpired(token, threshold);
|
||
expect(result).toBe(false);
|
||
});
|
||
|
||
it('should return true if the token is invalid', () => {
|
||
const invalidToken = 'invalid.token.string';
|
||
|
||
const result = isTokenExpired(invalidToken);
|
||
expect(result).toBe(true);
|
||
});
|
||
|
||
it("should throw an error if the token doesn't have an exp field", () => {
|
||
const token = jwt.sign({ data: 'no exp' }, 'secret', { noTimestamp: true }); // Токен без exp
|
||
const result = isTokenExpired(token);
|
||
expect(result).toBe(true); // Ожидается, что вернётся true
|
||
});
|
||
});
|