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
36 changes: 36 additions & 0 deletions .github/workflows/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# CI/CD Workflow

This directory contains GitHub Actions workflows for automated testing and validation.

## CI / Validation Workflow (`.github/workflows/test.yml`)

**Purpose**: Prevents regressions by running all test suites and linting on every pull request to main.

**Triggers**:

- Pull requests targeting the `main` branch

**What it does**:

1. **Setup**: Installs Rust (stable) and Node.js (v20) with dependency caching
2. **Dependency Installation**: Uses `npm install` for both backend and frontend
3. **Code Quality**: Runs linting on both backend and frontend (if configured)
4. **Backend Tests**: Runs `npm test` in `/backend` (Vitest + TypeScript)
5. **Frontend Tests**: Runs `npm test --if-present` in `/frontend` (no test framework configured yet)
6. **Smart Contract Tests**: Runs `cargo test` in `/contracts` (Rust)

**Failure Behavior**:

- Workflow fails if any test or linting step fails
- Blocks PR merge until all checks pass
- Uses `--if-present` to avoid failures when test scripts are missing

**Requirements for Contributors**:

- Ensure lint and test scripts are properly configured in `package.json`
- Tests must pass in all directories where they exist
- New dependencies should be added to respective `package.json` files
- Backend uses Vitest, frontend has no test framework configured yet
- react-hot-toast is available as a root dependency

**Note**: The workflow uses `continue-on-error: false` to ensure strict validation - any failure will prevent the PR from being merged.
68 changes: 68 additions & 0 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
name: CI / Validation

on:
pull_request:
branches: [main]

jobs:
test:
runs-on: ubuntu-latest

steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Install Rust
uses: dtolnay/rust-toolchain@stable
with:
toolchain: stable

- name: Install Node.js
uses: actions/setup-node@v4
with:
node-version: "20"
cache: "npm"

- name: Cache Rust dependencies
uses: actions/cache@v4
with:
path: |
~/.cargo/registry
~/.cargo/git
contracts/target
key: ${{ runner.os }}-cargo-${{ hashFiles('contracts/**/Cargo.lock') }}
restore-keys: |
${{ runner.os }}-cargo-

- name: Install backend dependencies
run: npm install
working-directory: ./backend

- name: Install frontend dependencies
run: npm install
working-directory: ./frontend

- name: Run linting (backend)
run: npm run lint --if-present
working-directory: ./backend
continue-on-error: false

- name: Run linting (frontend)
run: npm run lint --if-present
working-directory: ./frontend
continue-on-error: false

- name: Run Rust tests
run: cargo test
working-directory: ./contracts
continue-on-error: false

- name: Run backend tests
run: npm test
working-directory: ./backend
continue-on-error: false

- name: Run frontend tests
run: npm test
working-directory: ./frontend
continue-on-error: false
3 changes: 3 additions & 0 deletions backend/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,9 @@
"@types/cors": "^2.8.19",
"@types/express": "^5.0.6",
"@types/node": "^25.2.3",

"@types/supertest": "^6.0.3",

"@types/pg": "^8.16.0",
"@types/supertest": "^7.2.0",
"@types/swagger-jsdoc": "^6.0.4",
Expand Down
2 changes: 1 addition & 1 deletion backend/tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -43,4 +43,4 @@
"src/**/*",
"tests/**/*"
]
}
}
1 change: 1 addition & 0 deletions frontend/__tests__/setup.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
import "@testing-library/jest-dom";
90 changes: 47 additions & 43 deletions frontend/app/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,11 @@ import type { Metadata } from "next";
import { IBM_Plex_Mono, Sora } from "next/font/google";
import React from "react";

import "./globals.css";
import { WalletProvider } from "@/context/wallet-context";
import { Toaster } from "react-hot-toast";
import { ThemeProvider } from "@/context/theme-provider";
import { Banner } from "@/components/ui/Banner";
import bannerConfig from "@/lib/banner.config";
import { WalletProvider } from "@/context/wallet-context";
import Link from "next/link";
import { Toaster } from "react-hot-toast";
import "./globals.css";

const sora = Sora({
variable: "--font-display",
Expand Down Expand Up @@ -41,44 +39,50 @@ export default function RootLayout({
enableSystem={false}
disableTransitionOnChange
>
<WalletProvider>
<header className="bg-white dark:bg-gray-800 border-b border-gray-200 dark:border-gray-700">
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-4 flex justify-between items-center">
<div className="flex items-center gap-2">
<span className="text-xl font-bold text-blue-600">
FlowFi
</span>
</div>
<nav className="flex gap-6">
<Link
href="/"
className="text-sm font-medium text-gray-700 dark:text-gray-300 hover:text-blue-600 transition-colors"
>
Outgoing
</Link>
<Link
href="/incoming"
className="text-sm font-medium text-gray-700 dark:text-gray-300 hover:text-blue-600 transition-colors"
>
Incoming
</Link>
</nav>
</div>
</header>
<Toaster
position="top-right"
toastOptions={{
duration: 4000,
style: {
background: "#111",
color: "#fff",
border: "1px solid #333",
borderRadius: "12px",
},
}}
/>
{children}
</WalletProvider>
<WalletProvider>
<header className="bg-white dark:bg-gray-800 border-b border-gray-200 dark:border-gray-700">
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-4 flex justify-between items-center">
<div className="flex items-center gap-2">
<span className="text-xl font-bold text-blue-600">
FlowFi
</span>
</div>
<nav className="flex gap-6">
<Link
href="/outgoing"
className="text-sm font-medium text-gray-700 dark:text-gray-300 hover:text-blue-600 transition-colors"
>
Outgoing
</Link>
<Link
href="/incoming"
className="text-sm font-medium text-gray-700 dark:text-gray-300 hover:text-blue-600 transition-colors"
>
Incoming
</Link>
<Link
href="/settings"
className="text-sm font-medium text-gray-700 dark:text-gray-300 hover:text-blue-600 transition-colors"
>
Settings
</Link>
</nav>
</div>
</header>
<Toaster
position="top-right"
toastOptions={{
duration: 4000,
style: {
background: "#111",
color: "#fff",
border: "1px solid #333",
borderRadius: "12px",
},
}}
/>
{children}
</WalletProvider>
</ThemeProvider>
</body>
</html>
Expand Down
Loading
Loading