From 8cea93220b0873f4fff7af4045d4072660b7a3ed Mon Sep 17 00:00:00 2001 From: Ilia Mashkov Date: Tue, 24 Mar 2026 13:02:58 +0300 Subject: [PATCH] feat(auth): create selectors for authStore; cover them with tests --- src/features/auth/model/selectors/index.ts | 2 ++ .../selectAuthData/selectAuthData.spec.ts | 14 +++++++++++ .../selectAuthData/selectAuthData.ts | 7 ++++++ .../selectFormValid/selectFormValid.spec.ts | 25 +++++++++++++++++++ .../selectFormValid/selectFormValid.ts | 4 +++ 5 files changed, 52 insertions(+) create mode 100644 src/features/auth/model/selectors/index.ts create mode 100644 src/features/auth/model/selectors/selectAuthData/selectAuthData.spec.ts create mode 100644 src/features/auth/model/selectors/selectAuthData/selectAuthData.ts create mode 100644 src/features/auth/model/selectors/selectFormValid/selectFormValid.spec.ts create mode 100644 src/features/auth/model/selectors/selectFormValid/selectFormValid.ts diff --git a/src/features/auth/model/selectors/index.ts b/src/features/auth/model/selectors/index.ts new file mode 100644 index 0000000..f81592d --- /dev/null +++ b/src/features/auth/model/selectors/index.ts @@ -0,0 +1,2 @@ +export * from "./selectFormValid/selectFormValid"; +export * from "./selectAuthData/selectAuthData"; diff --git a/src/features/auth/model/selectors/selectAuthData/selectAuthData.spec.ts b/src/features/auth/model/selectors/selectAuthData/selectAuthData.spec.ts new file mode 100644 index 0000000..4fce0b1 --- /dev/null +++ b/src/features/auth/model/selectors/selectAuthData/selectAuthData.spec.ts @@ -0,0 +1,14 @@ +import { useAuthStore } from "../../stores/authStore/authStore"; +import { selectAuthData } from "./selectAuthData"; +import { MOCK_EMAIL, MOCK_PASSWORD } from "../../../api/calls/mocks"; + +describe("selectAuthData", () => { + it("should return the correct auth data", () => { + useAuthStore.getState().setEmail(MOCK_EMAIL); + useAuthStore.getState().setPassword(MOCK_PASSWORD); + expect(selectAuthData(useAuthStore.getState())).toEqual({ + email: MOCK_EMAIL, + password: MOCK_PASSWORD, + }); + }); +}); diff --git a/src/features/auth/model/selectors/selectAuthData/selectAuthData.ts b/src/features/auth/model/selectors/selectAuthData/selectAuthData.ts new file mode 100644 index 0000000..a4a7f02 --- /dev/null +++ b/src/features/auth/model/selectors/selectAuthData/selectAuthData.ts @@ -0,0 +1,7 @@ +import type { AuthData } from "../../types/service"; +import type { AuthStore } from "../../types/store"; + +export const selectAuthData = (state: AuthStore): AuthData => ({ + email: state.formData.email.value, + password: state.formData.password.value, +}); diff --git a/src/features/auth/model/selectors/selectFormValid/selectFormValid.spec.ts b/src/features/auth/model/selectors/selectFormValid/selectFormValid.spec.ts new file mode 100644 index 0000000..f6d85c1 --- /dev/null +++ b/src/features/auth/model/selectors/selectFormValid/selectFormValid.spec.ts @@ -0,0 +1,25 @@ +import { MOCK_EMAIL, MOCK_PASSWORD } from "../../../api/calls/mocks"; +import { useAuthStore } from "../../stores/authStore/authStore"; +import { selectFormValid } from "./selectFormValid"; + +describe("selectFormValid", () => { + afterEach(() => { + useAuthStore.getState().reset(); + }); + + it("should be false when email is invalid", () => { + useAuthStore.getState().setEmail(""); + expect(selectFormValid(useAuthStore.getState())).toBe(false); + }); + + it("should be false when password is invalid", () => { + useAuthStore.getState().setPassword(""); + expect(selectFormValid(useAuthStore.getState())).toBe(false); + }); + + it("should be true when email and password are valid", () => { + useAuthStore.getState().setEmail(MOCK_EMAIL); + useAuthStore.getState().setPassword(MOCK_PASSWORD); + expect(selectFormValid(useAuthStore.getState())).toBe(true); + }); +}); diff --git a/src/features/auth/model/selectors/selectFormValid/selectFormValid.ts b/src/features/auth/model/selectors/selectFormValid/selectFormValid.ts new file mode 100644 index 0000000..05d4c4a --- /dev/null +++ b/src/features/auth/model/selectors/selectFormValid/selectFormValid.ts @@ -0,0 +1,4 @@ +import type { AuthStore } from "../../types/store"; + +export const selectFormValid = (state: AuthStore) => + Object.values(state.formData).every((field) => field.valid);