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
3 changes: 3 additions & 0 deletions biome.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@
"includes": [
"**/packages/client/src/**/*.{ts,tsx,js,jsx}",
"**/packages/client/*.{ts,tsx,js,jsx}",
"**/packages/admin/src/**/*.{ts,tsx,js,jsx}",
"**/packages/admin/*.{ts,tsx,js,jsx}",
"**/packages/api/src/**/*.{ts,tsx,js,jsx}",
"**/packages/indexer/src/**/*.{ts,tsx,js,jsx}",
"**/packages/contracts/src/**/*.{ts,tsx,js,jsx}",
Expand Down Expand Up @@ -56,6 +58,7 @@
"files": {
"includes": [
"**/packages/client/src/**/*.{ts,tsx,js,jsx}",
"**/packages/admin/src/**/*.{ts,tsx,js,jsx}",
"**/packages/api/src/**/*.{ts,tsx,js,jsx}",
"**/packages/indexer/src/**/*.{ts,tsx,js,jsx}",
"**/packages/contracts/src/**/*.{ts,tsx,js,jsx}",
Expand Down
6 changes: 3 additions & 3 deletions packages/admin/src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import Contracts from "@/views/Contracts";
function App() {
return (
<UrqlProvider value={urqlClient}>
<BrowserRouter>
<BrowserRouter>
<Routes>
<Route path="/login" element={<Login />} />
<Route element={<RequireAuth />}>
Expand Down Expand Up @@ -75,9 +75,9 @@ function App() {
},
}}
/>
</BrowserRouter>
</BrowserRouter>
</UrqlProvider>
);
}

export default App;
export default App;
2 changes: 1 addition & 1 deletion packages/admin/src/__mocks__/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ vi.mock("@privy-io/react-auth", () => ({
},
],
}),
PrivyProvider: ({ children }: { children: React.ReactNode }) =>
PrivyProvider: ({ children }: { children: React.ReactNode }) =>
React.createElement("div", { "data-testid": "privy-provider" }, children),
}));

Expand Down
2 changes: 1 addition & 1 deletion packages/admin/src/__mocks__/privy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ export const MockPrivyProvider = ({ children }: { children: React.ReactNode }) =
export const createMockPrivyUser = (role: "admin" | "operator" | "unauthorized") => {
const addressMap = {
admin: "0x2aa64E6d80390F5C017F0313cB908051BE2FD35e",
operator: "0x04D60647836bcA09c37B379550038BdaaFD82503",
operator: "0x04D60647836bcA09c37B379550038BdaaFD82503",
unauthorized: "0x1234567890123456789012345678901234567890",
};

Expand Down
106 changes: 54 additions & 52 deletions packages/admin/src/__mocks__/server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,51 +6,51 @@ const handlers = [
// Mock GetGardens query
graphql.query("GetGardens", ({ variables }) => {
const chainId = variables.chainId as number;

// Filter gardens by chainId
const allGardens = [
{
id: "0x1234567890123456789012345678901234567890",
chainId: 84532,
tokenAddress: "0xabcd1234567890123456789012345678901234ef",
tokenID: "1",
name: "Test Garden 1",
description: "A test garden for unit testing",
location: "Test Location",
bannerImage: "https://example.com/banner1.jpg",
createdAt: "2024-01-01T00:00:00Z",
gardeners: ["0x2aa64E6d80390F5C017F0313cB908051BE2FD35e"],
operators: ["0x04D60647836bcA09c37B379550038BdaaFD82503"],
},
{
id: "0x2345678901234567890123456789012345678901",
chainId: 84532,
tokenAddress: "0xbcde2345678901234567890123456789012345f0",
tokenID: "2",
name: "Test Garden 2",
description: "Another test garden",
location: "Test Location 2",
bannerImage: "https://example.com/banner2.jpg",
createdAt: "2024-01-02T00:00:00Z",
gardeners: ["0x04D60647836bcA09c37B379550038BdaaFD82503"],
operators: ["0x04D60647836bcA09c37B379550038BdaaFD82503"],
},
];
{
id: "0x1234567890123456789012345678901234567890",
chainId: 84532,
tokenAddress: "0xabcd1234567890123456789012345678901234ef",
tokenID: "1",
name: "Test Garden 1",
description: "A test garden for unit testing",
location: "Test Location",
bannerImage: "https://example.com/banner1.jpg",
createdAt: "2024-01-01T00:00:00Z",
gardeners: ["0x2aa64E6d80390F5C017F0313cB908051BE2FD35e"],
operators: ["0x04D60647836bcA09c37B379550038BdaaFD82503"],
},
{
id: "0x2345678901234567890123456789012345678901",
chainId: 84532,
tokenAddress: "0xbcde2345678901234567890123456789012345f0",
tokenID: "2",
name: "Test Garden 2",
description: "Another test garden",
location: "Test Location 2",
bannerImage: "https://example.com/banner2.jpg",
createdAt: "2024-01-02T00:00:00Z",
gardeners: ["0x04D60647836bcA09c37B379550038BdaaFD82503"],
operators: ["0x04D60647836bcA09c37B379550038BdaaFD82503"],
},
];

// Filter by chainId
const filteredGardens = allGardens.filter(garden => garden.chainId === chainId);
// Filter by chainId
const filteredGardens = allGardens.filter((garden) => garden.chainId === chainId);

return HttpResponse.json({
data: {
Garden: filteredGardens,
},
});
return HttpResponse.json({
data: {
Garden: filteredGardens,
},
});
}),

// Mock GetDashboardStats query
graphql.query("GetDashboardStats", ({ variables }) => {
const chainId = variables.chainId as number;

const allGardens = [
{
id: "0x1234567890123456789012345678901234567890",
Expand All @@ -68,7 +68,7 @@ const handlers = [
},
];

const filteredGardens = allGardens.filter(garden => garden.chainId === chainId);
const filteredGardens = allGardens.filter((garden) => garden.chainId === chainId);

return HttpResponse.json({
data: {
Expand All @@ -80,7 +80,7 @@ const handlers = [
// Mock GetOperatorGardens query
graphql.query("GetOperatorGardens", ({ variables }) => {
const operator = variables.operator as string[];

// Return gardens where the operator is listed
const operatorGardens = [
{
Expand All @@ -104,22 +104,24 @@ const handlers = [
// Mock GetGardenDetail query
graphql.query("GetGardenDetail", ({ variables }) => {
const id = variables.id as string;

return HttpResponse.json({
data: {
Garden: [{
id,
chainId: 84532,
tokenAddress: "0xabcd1234567890123456789012345678901234ef",
tokenID: "1",
name: "Test Garden Detail",
description: "Detailed test garden",
location: "Test Location",
bannerImage: "https://example.com/banner.jpg",
createdAt: "2024-01-01T00:00:00Z",
gardeners: ["0x2aa64E6d80390F5C017F0313cB908051BE2FD35e"],
operators: ["0x04D60647836bcA09c37B379550038BdaaFD82503"],
}],
Garden: [
{
id,
chainId: 84532,
tokenAddress: "0xabcd1234567890123456789012345678901234ef",
tokenID: "1",
name: "Test Garden Detail",
description: "Detailed test garden",
location: "Test Location",
bannerImage: "https://example.com/banner.jpg",
createdAt: "2024-01-01T00:00:00Z",
gardeners: ["0x2aa64E6d80390F5C017F0313cB908051BE2FD35e"],
operators: ["0x04D60647836bcA09c37B379550038BdaaFD82503"],
},
],
},
});
}),
Expand Down
9 changes: 5 additions & 4 deletions packages/admin/src/__tests__/components/RequireAuth.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,11 @@ vi.mock("react-router-dom", async () => {
const actual = await vi.importActual("react-router-dom");
return {
...actual,
Navigate: ({ to }: { to: string }) => React.createElement("div", {
"data-testid": "navigate",
"data-to": to
}),
Navigate: ({ to }: { to: string }) =>
React.createElement("div", {
"data-testid": "navigate",
"data-to": to,
}),
Outlet: () => React.createElement("div", { "data-testid": "outlet" }, "Protected Content"),
useLocation: () => mockUseLocation(),
};
Expand Down
8 changes: 6 additions & 2 deletions packages/admin/src/__tests__/components/RequireRole.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,9 @@ describe("RequireRole", () => {

expect(screen.getByText("Unauthorized")).toBeInTheDocument();
expect(screen.getByText("You don't have permission to access this area.")).toBeInTheDocument();
expect(screen.queryByText("Contact an admin to be added as an operator.")).not.toBeInTheDocument();
expect(
screen.queryByText("Contact an admin to be added as an operator.")
).not.toBeInTheDocument();
expect(screen.queryByTestId("outlet")).not.toBeInTheDocument();
});

Expand All @@ -129,6 +131,8 @@ describe("RequireRole", () => {

render(<RequireRole allowedRoles={["admin"]} />);

expect(screen.queryByText("Contact an admin to be added as an operator.")).not.toBeInTheDocument();
expect(
screen.queryByText("Contact an admin to be added as an operator.")
).not.toBeInTheDocument();
});
});
4 changes: 2 additions & 2 deletions packages/admin/src/__tests__/components/auth.simple.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -42,10 +42,10 @@ describe("Authentication Logic", () => {
search: "?tab=details",
hash: "#section1",
};

const redirectTo = encodeURIComponent(location.pathname + location.search + location.hash);
const expectedRedirect = `/login?redirectTo=${redirectTo}`;

expect(expectedRedirect).toBe("/login?redirectTo=%2Fgardens%2F123%3Ftab%3Ddetails%23section1");
});

Expand Down
Loading