From d7dc3cc72f46493e9c2d8505db5e1ff1ed5c709d Mon Sep 17 00:00:00 2001 From: Teodor Date: Sat, 25 Apr 2026 23:32:11 +0200 Subject: [PATCH] crud tests for subjects, assignments and tasks --- .../assignment/createAssignment.test.tsx | 73 + .../assignment/deleteAssignment.test.tsx | 110 + __tests__/assignment/editAssignment.test.tsx | 99 + __tests__/subject/createSubject.test.tsx | 48 + __tests__/subject/deleteSubject.test.tsx | 111 + __tests__/subject/editSubject.test.tsx | 72 + __tests__/task/createTask.test.tsx | 55 + __tests__/task/deleteTask.test.tsx | 97 + __tests__/task/editTask.test.tsx | 76 + app.json | 7 +- app/assignment/createAssignment.tsx | 2 + app/assignment/editAssignment.tsx | 3 +- app/assignment/viewDetailsAssignment.tsx | 4 +- app/subject/createSubject.tsx | 2 + app/subject/editSubject.tsx | 3 +- app/subject/viewDetailsSubject.tsx | 2 +- app/task/createTask.tsx | 2 + app/task/editTask.tsx | 3 +- app/task/viewDetailsTask.tsx | 2 +- notes/work-report-2026-04-24-to-25.md | 71 + package-lock.json | 2908 ++++++++++++++++- package.json | 15 +- 22 files changed, 3749 insertions(+), 16 deletions(-) create mode 100644 __tests__/assignment/createAssignment.test.tsx create mode 100644 __tests__/assignment/deleteAssignment.test.tsx create mode 100644 __tests__/assignment/editAssignment.test.tsx create mode 100644 __tests__/subject/createSubject.test.tsx create mode 100644 __tests__/subject/deleteSubject.test.tsx create mode 100644 __tests__/subject/editSubject.test.tsx create mode 100644 __tests__/task/createTask.test.tsx create mode 100644 __tests__/task/deleteTask.test.tsx create mode 100644 __tests__/task/editTask.test.tsx create mode 100644 notes/work-report-2026-04-24-to-25.md diff --git a/__tests__/assignment/createAssignment.test.tsx b/__tests__/assignment/createAssignment.test.tsx new file mode 100644 index 0000000..bbfe945 --- /dev/null +++ b/__tests__/assignment/createAssignment.test.tsx @@ -0,0 +1,73 @@ +import { supabase } from "@/lib/supabase"; +import { fireEvent, render, waitFor } from "@testing-library/react-native"; +import { router } from "expo-router"; +import CreateAssignment from "../../app/assignment/createAssignment"; + +const mockSingle = jest.fn(); +const mockSelect = jest.fn(() => ({ single: mockSingle, })); +const mockInsert = jest.fn(() => ({ select: mockSelect, })); + +jest.mock("expo-router", () => ({ + router: { + back: jest.fn(), + replace: jest.fn(), + }, + Stack: { + Screen: () => null, + }, + useLocalSearchParams: () => ({ + sId: null, + }), +})); + +jest.mock("@/lib/progress", () => ({ + CheckAssignmentCompletion: jest.fn(), +})); + +jest.mock("@/lib/asyncStorage", () => ({ + SaveAssignmentNotificationId: jest.fn(), +})); + +jest.mock("expo-notifications", () => ({ + scheduleNotificationAsync: jest.fn(() => Promise.resolve("notification-123")), + SchedulableTriggerInputTypes: { + DATE: "date", + }, +})); + +jest.mock("@/lib/supabase", () => { + return { + supabase: { + auth: { + getUser: jest.fn(() => + Promise.resolve({ + data: { user: { id: "user-123" } }, + error: null, + }) + ), + }, + from: jest.fn(() => ({ + insert: mockInsert, + })), + }, + }; +}); + +test("creates an assignment and navigates back", async () => { + mockSingle.mockResolvedValue({ + data: { + aId: "assignment-123", title: "create a simple test", deadline: "", + }, + error: null, + }); + + const screen = render(); + fireEvent.changeText(screen.getByTestId("assignment-title-input"), "create a simple test"); + fireEvent.press(screen.getByTestId("create-assignment-button")); + + await waitFor(() => { + expect(supabase.from).toHaveBeenCalledWith("assignments"); + expect(mockInsert).toHaveBeenCalled(); + expect(router.back).toHaveBeenCalled(); + }); +}); \ No newline at end of file diff --git a/__tests__/assignment/deleteAssignment.test.tsx b/__tests__/assignment/deleteAssignment.test.tsx new file mode 100644 index 0000000..02de5a3 --- /dev/null +++ b/__tests__/assignment/deleteAssignment.test.tsx @@ -0,0 +1,110 @@ +import { supabase } from "@/lib/supabase"; +import { fireEvent, render, waitFor } from "@testing-library/react-native"; +import { router } from "expo-router"; +import { Alert } from "react-native"; +import ViewDetailsAssignment from "../../app/assignment/viewDetailsAssignment"; + +const mockSingleAssignment = jest.fn(); +const mockSelectAssignmentEq = jest.fn(() => ({ single: mockSingleAssignment, })); +const mockSelectAssignment = jest.fn(() => ({ eq: mockSelectAssignmentEq, })); +const mockSelectTasksEq = jest.fn(); +const mockSelectTasks = jest.fn(() => ({ eq: mockSelectTasksEq })); +const mockDeleteAssignmentEq = jest.fn(); +const mockDeleteAssignment = jest.fn(() => ({ eq: mockDeleteAssignmentEq, })); + +jest.mock("expo-router", () => ({ + router: { + back: jest.fn(), + replace: jest.fn(), + }, + Stack: { + Screen: () => null, + }, + useLocalSearchParams: () => ({ + aId: "assignment-123", + }), + useFocusEffect: (callback: () => void) => callback(), +})); + +jest.mock("@/lib/supabase", () => { + return { + supabase: { + auth: { + getUser: jest.fn(() => + Promise.resolve({ + data: { user: { uId: "user-123" } }, + error: null, + }) + ), + getSession: jest.fn(() => + Promise.resolve({ + data: { + session: { + user: { uId: "user-123" }, + }, + }, + }) + ), + onAuthStateChange: jest.fn(() => ({ + data: { + subscription: { + unsubscribe: jest.fn(), + }, + }, + })), + }, + from: jest.fn((table) => { + if (table === "assignments") { + return { + select: mockSelectAssignment, + delete: mockDeleteAssignment, + }; + } + + if (table === "tasks") { + return { + select: mockSelectTasks, + }; + } + + return {}; + }), + }, + }; +}); + +const alertSpy = jest.spyOn(Alert, "alert"); + +test("deletes a task and navigates back", async () => { + mockSingleAssignment.mockResolvedValue({ + data: { + aId: "assignment-123", + title: "create a simple test", + uId: "user-123", + }, + error: null, + }); + mockSelectTasksEq.mockResolvedValue({ data: [], error: null, }) + mockDeleteAssignmentEq.mockResolvedValue({ error: null, }); + + const screen = render(); + fireEvent.press(await screen.findByTestId("delete-assignment-button")); + + expect(alertSpy).toHaveBeenCalledWith( + "Delete Assignment", + "Are you sure you want to delete this assignment?", + expect.any(Array), + ); + + const alertButtons = alertSpy.mock.calls[0][2]; + const confirmDeleteButton = alertButtons[1]; + + await confirmDeleteButton.onPress(); + + await waitFor(() => { + expect(supabase.from).toHaveBeenCalledWith("assignments"); + expect(mockDeleteAssignment).toHaveBeenCalled(); + expect(mockDeleteAssignmentEq).toHaveBeenCalledWith("aId", "assignment-123"); + expect(router.back).toHaveBeenCalled(); + }); +}); \ No newline at end of file diff --git a/__tests__/assignment/editAssignment.test.tsx b/__tests__/assignment/editAssignment.test.tsx new file mode 100644 index 0000000..6a9e577 --- /dev/null +++ b/__tests__/assignment/editAssignment.test.tsx @@ -0,0 +1,99 @@ +import EditAssignment from "@/app/assignment/editAssignment"; +import { supabase } from "@/lib/supabase"; +import { fireEvent, render, waitFor } from "@testing-library/react-native"; +import { router } from "expo-router"; + +const mockUpdateSingle = jest.fn(); +const mockUpdateSelect = jest.fn(() => ({ single: mockUpdateSingle, })); +const mockUpdateEq = jest.fn(() => ({ select: mockUpdateSelect, })); +const mockUpdate = jest.fn(() => ({ eq: mockUpdateEq, })); +const mockSingle = jest.fn(); +const mockSelectEq = jest.fn(() => ({ single: mockSingle, })); +const mockSelect = jest.fn(() => ({ eq: mockSelectEq, })); + +jest.mock("expo-router", () => ({ + router: { + back: jest.fn(), + replace: jest.fn(), + }, + Stack: { + Screen: () => null, + }, + useLocalSearchParams: () => ({ + aId: "assignment-123", + }), + useFocusEffect: (callback: () => void) => callback(), +})); + +jest.mock("@/lib/progress", () => ({ + CheckAssignmentCompletion: jest.fn(), +})); + +jest.mock("@/lib/asyncStorage", () => ({ + GetAssignmentNotificationId: jest.fn(() => Promise.resolve(null)), +})); + +jest.mock("expo-notifications", () => ({ + scheduleNotificationAsync: jest.fn(() => Promise.resolve("notification-123")), + SchedulableTriggerInputTypes: { + DATE: "date", + }, +})); + +jest.mock("@/lib/supabase", () => { + return { + supabase: { + auth: { + getUser: jest.fn(() => + Promise.resolve({ + data: { user: { id: "user-123" } }, + error: null, + }) + ), + }, + from: jest.fn(() => ({ + select: mockSelect, + update: mockUpdate, + })), + }, + }; +}); + +test("updates an assignment and navigates back", async () => { + mockSingle.mockResolvedValue({ + data: { + aId: "assignment-123", + title: "create a simple test", + uId: "user-123", + deadline: "2026-04-25", + }, + error: null, + }); + mockUpdateSingle.mockResolvedValue({ + data: { + aId: "assignment-123", + title: "create a harder test", + uId: "user-123", + deadline: "2026-04-25", + }, + error: null, + }); + + const screen = render(); + fireEvent.changeText(await screen.findByTestId("assignment-title-input"), "create a harder test"); + fireEvent.press(screen.getByTestId("edit-assignment-button")); + + await waitFor(() => { + expect(supabase.from).toHaveBeenCalledWith("assignments"); + expect(mockSelect).toHaveBeenCalled(); + expect(mockUpdate).toHaveBeenCalledWith( + expect.objectContaining({ + title: "create a harder test", + uId: "user-123", + deadline: "2026-04-25", + }) + ); + expect(mockUpdateSingle).toHaveBeenCalled(); + expect(router.back).toHaveBeenCalled(); + }); +}); \ No newline at end of file diff --git a/__tests__/subject/createSubject.test.tsx b/__tests__/subject/createSubject.test.tsx new file mode 100644 index 0000000..a375ec5 --- /dev/null +++ b/__tests__/subject/createSubject.test.tsx @@ -0,0 +1,48 @@ +import { supabase } from "@/lib/supabase"; +import { fireEvent, render, waitFor } from "@testing-library/react-native"; +import { router } from "expo-router"; +import CreateSubject from "../../app/subject/createSubject"; + +const mockInsert = jest.fn(); + +jest.mock("expo-router", () => ({ + router: { + back: jest.fn(), + replace: jest.fn(), + }, + Stack: { + Screen: () => null, + }, +})); + +jest.mock("@/lib/supabase", () => { + return { + supabase: { + auth: { + getUser: jest.fn(() => + Promise.resolve({ + data: { user: { id: "user-123" } }, + error: null, + }) + ), + }, + from: jest.fn(() => ({ + insert: mockInsert, + })), + }, + }; +}); + +test("creates a subject and navigates back", async () => { + mockInsert.mockResolvedValue({ error: null }); + + const screen = render(); + fireEvent.changeText(screen.getByTestId("subject-title-input"), "ikt205g26v"); + fireEvent.press(screen.getByTestId("create-subject-button")); + + await waitFor(() => { + expect(supabase.from).toHaveBeenCalledWith("subjects"); + expect(mockInsert).toHaveBeenCalled(); + expect(router.back).toHaveBeenCalled(); + }); +}); \ No newline at end of file diff --git a/__tests__/subject/deleteSubject.test.tsx b/__tests__/subject/deleteSubject.test.tsx new file mode 100644 index 0000000..a184c76 --- /dev/null +++ b/__tests__/subject/deleteSubject.test.tsx @@ -0,0 +1,111 @@ +import { supabase } from "@/lib/supabase"; +import { fireEvent, render, waitFor } from "@testing-library/react-native"; +import { router } from "expo-router"; +import { Alert } from "react-native"; +import ViewDetailsSubject from "../../app/subject/viewDetailsSubject"; + +const mockSingleSubject = jest.fn(); +const mockSelectSubjectEq = jest.fn(() => ({ single: mockSingleSubject, })); +const mockSelectSubject = jest.fn(() => ({ eq: mockSelectSubjectEq, })); +const mockOrderAssignments = jest.fn(); +const mockSelectAssignmentsEq = jest.fn(() => ({ order: mockOrderAssignments })); +const mockSelectAssignments = jest.fn(() => ({ eq: mockSelectAssignmentsEq })); +const mockDeleteSubjectEq = jest.fn(); +const mockDeleteSubject = jest.fn(() => ({ eq: mockDeleteSubjectEq, })); + +jest.mock("expo-router", () => ({ + router: { + back: jest.fn(), + replace: jest.fn(), + }, + Stack: { + Screen: () => null, + }, + useLocalSearchParams: () => ({ + sId: "subject-123", + }), + useFocusEffect: (callback: () => void) => callback(), +})); + +jest.mock("@/lib/supabase", () => { + return { + supabase: { + auth: { + getUser: jest.fn(() => + Promise.resolve({ + data: { user: { uId: "user-123" } }, + error: null, + }) + ), + getSession: jest.fn(() => + Promise.resolve({ + data: { + session: { + user: { uId: "user-123" }, + }, + }, + }) + ), + onAuthStateChange: jest.fn(() => ({ + data: { + subscription: { + unsubscribe: jest.fn(), + }, + }, + })), + }, + from: jest.fn((table) => { + if (table === "subjects") { + return { + select: mockSelectSubject, + delete: mockDeleteSubject, + }; + } + + if (table === "assignments") { + return { + select: mockSelectAssignments, + }; + } + + return {}; + }), + }, + }; +}); + +const alertSpy = jest.spyOn(Alert, "alert"); + +test("deletes a subject and navigates back", async () => { + mockSingleSubject.mockResolvedValue({ + data: { + sId: "subject-123", + title: "ikt205g26v", + uId: "user-123", + }, + error: null, + }); + mockOrderAssignments.mockResolvedValue({ data: [], error: null, }) + mockDeleteSubjectEq.mockResolvedValue({ error: null, }); + + const screen = render(); + fireEvent.press(await screen.findByTestId("delete-subject-button")); + + expect(alertSpy).toHaveBeenCalledWith( + "Delete Subject", + "Are you sure you want to delete this subject?", + expect.any(Array), + ); + + const alertButtons = alertSpy.mock.calls[0][2]; + const confirmDeleteButton = alertButtons[1]; + + await confirmDeleteButton.onPress(); + + await waitFor(() => { + expect(supabase.from).toHaveBeenCalledWith("subjects"); + expect(mockDeleteSubject).toHaveBeenCalled(); + expect(mockDeleteSubjectEq).toHaveBeenCalledWith("sId", "subject-123"); + expect(router.back).toHaveBeenCalled(); + }); +}); \ No newline at end of file diff --git a/__tests__/subject/editSubject.test.tsx b/__tests__/subject/editSubject.test.tsx new file mode 100644 index 0000000..f1c1790 --- /dev/null +++ b/__tests__/subject/editSubject.test.tsx @@ -0,0 +1,72 @@ +import { supabase } from "@/lib/supabase"; +import { fireEvent, render, waitFor } from "@testing-library/react-native"; +import { router } from "expo-router"; +import EditSubject from "../../app/subject/editSubject"; + +const mockUpdateEq = jest.fn(); +const mockUpdate = jest.fn(() => ({ eq: mockUpdateEq, })); +const mockSingle = jest.fn(); +const mockSelectEq = jest.fn(() => ({ single: mockSingle, })); +const mockSelect = jest.fn(() => ({ eq: mockSelectEq, })); + +jest.mock("expo-router", () => ({ + router: { + back: jest.fn(), + replace: jest.fn(), + }, + Stack: { + Screen: () => null, + }, + useLocalSearchParams: () => ({ + sId: "subject-123", + }), + useFocusEffect: (callback: () => void) => callback(), +})); + +jest.mock("@/lib/supabase", () => { + return { + supabase: { + auth: { + getUser: jest.fn(() => + Promise.resolve({ + data: { user: { id: "user-123" } }, + error: null, + }) + ), + }, + from: jest.fn(() => ({ + select: mockSelect, + update: mockUpdate, + })), + }, + }; +}); + +test("updates a subject and navigates back", async () => { + mockSingle.mockResolvedValue({ + data: { + sId: "subject-123", + title: "ikt205g26v", + uId: "user-123", + }, + error: null, + }); + mockUpdateEq.mockResolvedValue({ error: null, }); + + const screen = render(); + fireEvent.changeText(await screen.findByTestId("subject-title-input"), "ikt206g26v"); + fireEvent.press(screen.getByTestId("edit-subject-button")); + + await waitFor(() => { + expect(supabase.from).toHaveBeenCalledWith("subjects"); + expect(mockSelect).toHaveBeenCalled(); + expect(mockUpdate).toHaveBeenCalledWith( + expect.objectContaining({ + title: "ikt206g26v", + uId: "user-123", + }) + ); + expect(mockUpdateEq).toHaveBeenCalledWith("sId", "subject-123"); + expect(router.back).toHaveBeenCalled(); + }); +}); \ No newline at end of file diff --git a/__tests__/task/createTask.test.tsx b/__tests__/task/createTask.test.tsx new file mode 100644 index 0000000..61bd198 --- /dev/null +++ b/__tests__/task/createTask.test.tsx @@ -0,0 +1,55 @@ +import { supabase } from "@/lib/supabase"; +import { fireEvent, render, waitFor } from "@testing-library/react-native"; +import { router } from "expo-router"; +import CreateTask from "../../app/task/createTask"; + +const mockInsert = jest.fn(); + +jest.mock("expo-router", () => ({ + router: { + back: jest.fn(), + replace: jest.fn(), + }, + Stack: { + Screen: () => null, + }, + useLocalSearchParams: () => ({ + aId: null, + }), +})); + +jest.mock("@/lib/progress", () => ({ + CheckAssignmentCompletion: jest.fn(), +})); + +jest.mock("@/lib/supabase", () => { + return { + supabase: { + auth: { + getUser: jest.fn(() => + Promise.resolve({ + data: { user: { id: "user-123" } }, + error: null, + }) + ), + }, + from: jest.fn(() => ({ + insert: mockInsert, + })), + }, + }; +}); + +test("creates a task and navigates back", async () => { + mockInsert.mockResolvedValue({ error: null }); + + const screen = render(); + fireEvent.changeText(screen.getByTestId("task-title-input"), "Read chapter 4"); + fireEvent.press(screen.getByTestId("create-task-button")); + + await waitFor(() => { + expect(supabase.from).toHaveBeenCalledWith("tasks"); + expect(mockInsert).toHaveBeenCalled(); + expect(router.back).toHaveBeenCalled(); + }); +}); \ No newline at end of file diff --git a/__tests__/task/deleteTask.test.tsx b/__tests__/task/deleteTask.test.tsx new file mode 100644 index 0000000..dc6d162 --- /dev/null +++ b/__tests__/task/deleteTask.test.tsx @@ -0,0 +1,97 @@ +import { supabase } from "@/lib/supabase"; +import { fireEvent, render, waitFor } from "@testing-library/react-native"; +import { router } from "expo-router"; +import { Alert } from "react-native"; +import ViewDetailsTask from "../../app/task/viewDetailsTask"; + +const mockSingleTask = jest.fn(); +const mockSelectTaskEq = jest.fn(() => ({ single: mockSingleTask, })); +const mockSelectTask = jest.fn(() => ({ eq: mockSelectTaskEq, })); +const mockDeleteTaskEq = jest.fn(); +const mockDeleteTask = jest.fn(() => ({ eq: mockDeleteTaskEq, })); + +jest.mock("expo-router", () => ({ + router: { + back: jest.fn(), + replace: jest.fn(), + }, + Stack: { + Screen: () => null, + }, + useLocalSearchParams: () => ({ + tId: "task-123", + }), + useFocusEffect: (callback: () => void) => callback(), +})); + +jest.mock("@/lib/supabase", () => { + return { + supabase: { + auth: { + getUser: jest.fn(() => + Promise.resolve({ + data: { user: { uId: "user-123" } }, + error: null, + }) + ), + getSession: jest.fn(() => + Promise.resolve({ + data: { + session: { + user: { uId: "user-123" }, + }, + }, + }) + ), + onAuthStateChange: jest.fn(() => ({ + data: { + subscription: { + unsubscribe: jest.fn(), + }, + }, + })), + }, + from: jest.fn(() => { + return { + select: mockSelectTask, + delete: mockDeleteTask, + }; + }), + }, + }; +}); + +const alertSpy = jest.spyOn(Alert, "alert"); + +test("deletes a task and navigates back", async () => { + mockSingleTask.mockResolvedValue({ + data: { + tId: "task-123", + title: "Read chapter 4", + uId: "user-123", + }, + error: null, + }); + mockDeleteTaskEq.mockResolvedValue({ error: null, }); + + const screen = render(); + fireEvent.press(await screen.findByTestId("delete-task-button")); + + expect(alertSpy).toHaveBeenCalledWith( + "Delete Task", + "Are you sure you want to delete this task?", + expect.any(Array), + ); + + const alertButtons = alertSpy.mock.calls[0][2]; + const confirmDeleteButton = alertButtons[1]; + + await confirmDeleteButton.onPress(); + + await waitFor(() => { + expect(supabase.from).toHaveBeenCalledWith("tasks"); + expect(mockDeleteTask).toHaveBeenCalled(); + expect(mockDeleteTaskEq).toHaveBeenCalledWith("tId", "task-123"); + expect(router.back).toHaveBeenCalled(); + }); +}); \ No newline at end of file diff --git a/__tests__/task/editTask.test.tsx b/__tests__/task/editTask.test.tsx new file mode 100644 index 0000000..fcff96c --- /dev/null +++ b/__tests__/task/editTask.test.tsx @@ -0,0 +1,76 @@ +import { supabase } from "@/lib/supabase"; +import { fireEvent, render, waitFor } from "@testing-library/react-native"; +import { router } from "expo-router"; +import EditTask from "../../app/task/editTask"; + +const mockUpdateEq = jest.fn(); +const mockUpdate = jest.fn(() => ({ eq: mockUpdateEq, })); +const mockSingle = jest.fn(); +const mockSelectEq = jest.fn(() => ({ single: mockSingle, })); +const mockSelect = jest.fn(() => ({ eq: mockSelectEq, })); + +jest.mock("expo-router", () => ({ + router: { + back: jest.fn(), + replace: jest.fn(), + }, + Stack: { + Screen: () => null, + }, + useLocalSearchParams: () => ({ + tId: "task-123", + }), + useFocusEffect: (callback: () => void) => callback(), +})); + +jest.mock("@/lib/progress", () => ({ + CheckAssignmentCompletion: jest.fn(), +})); + +jest.mock("@/lib/supabase", () => { + return { + supabase: { + auth: { + getUser: jest.fn(() => + Promise.resolve({ + data: { user: { id: "user-123" } }, + error: null, + }) + ), + }, + from: jest.fn(() => ({ + select: mockSelect, + update: mockUpdate, + })), + }, + }; +}); + +test("updates a task and navigates back", async () => { + mockSingle.mockResolvedValue({ + data: { + tId: "task-123", + title: "Read chapter 4", + uId: "user-123", + }, + error: null, + }); + mockUpdateEq.mockResolvedValue({ error: null, }); + + const screen = render(); + fireEvent.changeText(await screen.findByTestId("task-title-input"), "Read chapter 5"); + fireEvent.press(screen.getByTestId("edit-task-button")); + + await waitFor(() => { + expect(supabase.from).toHaveBeenCalledWith("tasks"); + expect(mockSelect).toHaveBeenCalled(); + expect(mockUpdate).toHaveBeenCalledWith( + expect.objectContaining({ + title: "Read chapter 5", + uId: "user-123", + }) + ); + expect(mockUpdateEq).toHaveBeenCalledWith("tId", "task-123"); + expect(router.back).toHaveBeenCalled(); + }); +}); \ No newline at end of file diff --git a/app.json b/app.json index f4860ed..38def58 100644 --- a/app.json +++ b/app.json @@ -1,7 +1,7 @@ { "expo": { "name": "Study-Sprint", - "slug": "Study-Sprint", + "slug": "study-sprint", "version": "1.0.0", "orientation": "portrait", "icon": "./assets/images/icon.png", @@ -49,8 +49,9 @@ "extra": { "router": {}, "eas": { - "projectId": "25652385-934a-4a29-8fa7-deff3281e03e" + "projectId": "d9e26d91-0f0c-4b97-b11a-20be2916e9f3" } - } + }, + "owner": "ikt205g26v-g18" } } diff --git a/app/assignment/createAssignment.tsx b/app/assignment/createAssignment.tsx index f377cb0..2eb879f 100644 --- a/app/assignment/createAssignment.tsx +++ b/app/assignment/createAssignment.tsx @@ -153,6 +153,7 @@ export default function CreateAssignment() { Title {assignment.isCompleted ? 'Completed' : 'Not Completed'} -