Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
65 changes: 65 additions & 0 deletions __tests__/Grades.test.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
import React from 'react';
import { render, screen, fireEvent, waitFor, act } from '@testing-library/react';
import Page from '../app/grades/page';

jest.mock('next/navigation', () => ({
useRouter: jest.fn(),
usePathname: jest.fn(),
}));

global.fetch = jest.fn(() =>
Promise.resolve({
ok: true,
json: () => Promise.resolve([]),
})
) as jest.Mock;

describe('Grades Page', () => {
beforeEach(() => {
jest.clearAllMocks();
});

it('renders the grade form and all buttons', async () => {
await act(async () => {
render(<Page />);
});

expect(screen.getByRole('button', { name: /show all data/i })).toBeInTheDocument();
expect(screen.getByRole('button', { name: /class averages/i })).toBeInTheDocument();
expect(screen.getByRole('button', { name: /passing average/i })).toBeInTheDocument();
expect(screen.getByRole('button', { name: /high performing classes/i })).toBeInTheDocument();
});

it('shows "No data found" when no grades are returned', async () => {
await act(async () => {
render(<Page />);
});

await waitFor(() => {
expect(screen.getByText('No data found')).toBeInTheDocument();
});
});

it('shows error when submitting with empty fields', async () => {
await act(async () => {
render(<Page />);
});

fireEvent.click(screen.getByRole('button', { name: /submit/i }));

await waitFor(() => {
expect(screen.getByText('Please select a valid class.')).toBeInTheDocument();
});
});

it('allows typing a valid grade value', async () => {
await act(async () => {
render(<Page />);
});

const gradeInput = screen.getByLabelText('Grade') as HTMLInputElement;
fireEvent.change(gradeInput, { target: { value: '85' } });

expect(gradeInput.value).toBe('85');
});
});
42 changes: 42 additions & 0 deletions __tests__/Numbers.test.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
import { render, screen, fireEvent, waitFor } from '@testing-library/react';
import Page from '../app/numbers/page';


jest.mock('next/navigation', () => ({
useRouter: () => ({
push: jest.fn(),
replace: jest.fn(),
prefetch: jest.fn(),
back: jest.fn(),
}),
usePathname: () => '/mock-path',
}));

global.fetch = jest.fn(() =>
Promise.resolve({
ok: true,
json: () => Promise.resolve([]),
})
) as jest.Mock;

describe('Page Component', () => {
it('renders the Numbers Page title and shows "No data available" when no pairs exist', async () => {
render(<Page />);

await waitFor(() => {
expect(screen.getByText('Numbers Page')).toBeInTheDocument();
});

expect(screen.getByText('Adjacent Pairs and Their Sums')).toBeInTheDocument();
expect(screen.getByText('No data available')).toBeInTheDocument();
});

it('shows error when submitting empty input', async () => {
render(<Page />);

const submitButton = screen.getByRole('button', { name: /Submit/i });
fireEvent.click(submitButton);

expect(await screen.findByText('Number is required')).toBeInTheDocument();
});
});
1 change: 1 addition & 0 deletions api.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export const BASE_URL="http://localhost:3000/"
82 changes: 82 additions & 0 deletions app/api/grades/route.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
import prisma from "@/lib/prisma";
import { NextResponse } from "next/server";


export const GET = async (request: Request) => {
try {
const { searchParams } = new URL(request.url);
const filter = searchParams.get("filter");

let result;

switch (filter) {
case "averages":
result = await prisma.$queryRaw`
SELECT class, ROUND(AVG(grade), 2) as grade
FROM "Grades"
GROUP BY class
`;
break;
case "passing":
result = await prisma.$queryRaw`
SELECT class, ROUND(AVG(grade), 2) as grade
FROM "Grades"
GROUP BY class
HAVING AVG(grade) > 55
`;
break;
case "highperforming":
result = await prisma.$queryRaw`
SELECT class, ROUND(AVG(grade), 2) as grade
FROM "Grades"
GROUP BY class
HAVING AVG(grade) > 70
`;
break;
case "all":
default:
result = await prisma.$queryRaw`
SELECT * FROM "Grades"
`;
break;
}

return NextResponse.json(result, { status: 200 });
} catch (err) {
return NextResponse.json(
{ message: "Failed to fetch grades", error: String(err) },
{ status: 500 }
);
}
};


export const POST = async (request: Request) => {
try {
const body = await request.json();
const { sub, grade } = body;

const createdGrade = {
class: sub,
grade: grade,
}
await prisma.$queryRaw`
INSERT INTO "Grades" (class, grade)
VALUES (${sub}::"Class", ${grade})`

return new NextResponse(
JSON.stringify({ message: "Grade is created", createdGrade }),
{ status: 201 }
);
} catch (error) {
return new NextResponse(
JSON.stringify({
message: "Error in creating grade",
error: error instanceof Error ? error.message : error,
}),
{
status: 500,
}
);
}
};
62 changes: 62 additions & 0 deletions app/api/numbers/route.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
import prisma from "@/lib/prisma";
import { NextResponse } from "next/server";

export const GET = async () => {
try {
const getAllNubers: any = await prisma.$queryRaw`select * from "Numbers" n`
console.log(typeof getAllNubers, "getAllNubers")

const resultArray: any = []

getAllNubers.forEach((item: any, index: any) => {
resultArray.push(
{
ID1: item.id,
number1: item.value,
ID2: getAllNubers[index + 1] && getAllNubers[index + 1]['id'] ? getAllNubers[index + 1]['id'] : null,
number2: getAllNubers[index + 1] && getAllNubers[index + 1]['value'] ? getAllNubers[index + 1]['value'] : null,
sum: item.value + (getAllNubers[index + 1] && getAllNubers[index + 1]['value'] ? getAllNubers[index + 1]['value'] : 0)
}
)
});


if(resultArray.length > 1) {resultArray.pop()}

return new NextResponse(JSON.stringify(resultArray), { status: 200 });
} catch (error) {
return new NextResponse("Error in fetching users" + error, { status: 500 });
}
};

export const POST = async (request: Request) => {
try {
const body = await request.json();
const number = body['number']

const getLatestId: any = await prisma.$queryRaw`select id from "Numbers" n order by id desc limit 1`
console.log(getLatestId, getLatestId)
const latestId = getLatestId.length == 0 ? 1 : getLatestId[0]['id'] + 1

console.log(latestId, "latestId")
const createNumber = await prisma.$queryRaw`
INSERT INTO "Numbers" (id, value)
VALUES (${latestId}, ${number})
`;

return new NextResponse(
JSON.stringify({ message: "Number is created" }),
{ status: 201 }
);
} catch (error) {
return new NextResponse(
JSON.stringify({
message: "Error in creating user",
error,
}),
{
status: 500,
}
);
}
};
Loading