Compare commits

..

3 Commits

Author SHA1 Message Date
Arunavo Ray
4efe741c64 Bump version to 2.7.0 2025-05-24 17:39:23 +05:30
Arunavo Ray
773842fa72 feat: Improve cron job setup for automatic database cleanup with better error handling 2025-05-24 17:37:36 +05:30
Arunavo Ray
90944a40c6 feat: Remove health API tests to streamline codebase 2025-05-24 16:14:22 +05:30
3 changed files with 16 additions and 168 deletions

View File

@@ -227,26 +227,28 @@ fi
if command -v crontab >/dev/null 2>&1; then if command -v crontab >/dev/null 2>&1; then
echo "Setting up automatic database cleanup cron jobs..." echo "Setting up automatic database cleanup cron jobs..."
# Install cron if not already installed # Install cron if not already installed
if ! command -v cron >/dev/null 2>&1; then if ! command -v crond >/dev/null 2>&1; then
echo "Installing cron..." echo "Installing cron..."
apt-get update && apt-get install -y cron apk add --no-cache dcron
fi fi
# Install the cron job # Try to install the cron job, but don't fail if it doesn't work
crontab /app/data/cron/cleanup-cron if crontab /app/data/cron/cleanup-cron 2>/dev/null; then
echo "✅ Cron job installed successfully"
# Start cron service # Start cron service (Alpine uses crond)
if command -v service >/dev/null 2>&1; then if command -v crond >/dev/null 2>&1; then
service cron start crond -b
echo "Cron service started" echo "Cron daemon started"
elif command -v cron >/dev/null 2>&1; then else
cron echo "⚠️ Warning: Could not start cron service. Automatic database cleanup will not run."
echo "Cron daemon started" fi
else else
echo "Warning: Could not start cron service. Automatic database cleanup will not run." echo "⚠️ Warning: Could not install cron job (permission issue). Automatic database cleanup will not be set up."
echo "Consider setting up external scheduled tasks to run cleanup scripts."
fi fi
else else
echo "Warning: crontab command not found. Automatic database cleanup will not be set up." echo "⚠️ Warning: crontab command not found. Automatic database cleanup will not be set up."
echo "Consider setting up external scheduled tasks to run cleanup scripts." echo "Consider setting up external scheduled tasks to run cleanup scripts."
fi fi

View File

@@ -1,7 +1,7 @@
{ {
"name": "gitea-mirror", "name": "gitea-mirror",
"type": "module", "type": "module",
"version": "2.6.0", "version": "2.7.0",
"engines": { "engines": {
"bun": ">=1.2.9" "bun": ">=1.2.9"
}, },

View File

@@ -1,154 +0,0 @@
import { describe, test, expect, mock, beforeEach, afterEach } from "bun:test";
import { GET } from "./health";
import * as dbModule from "@/lib/db";
import os from "os";
// Mock the database module
mock.module("@/lib/db", () => {
return {
db: {
select: () => ({
from: () => ({
limit: () => Promise.resolve([{ test: 1 }])
})
})
}
};
});
// Mock the os functions individually
const originalPlatform = os.platform;
const originalVersion = os.version;
const originalArch = os.arch;
const originalTotalmem = os.totalmem;
const originalFreemem = os.freemem;
describe("Health API Endpoint", () => {
beforeEach(() => {
// Mock os functions
os.platform = mock(() => "test-platform");
os.version = mock(() => "test-version");
os.arch = mock(() => "test-arch");
os.totalmem = mock(() => 16 * 1024 * 1024 * 1024); // 16GB
os.freemem = mock(() => 8 * 1024 * 1024 * 1024); // 8GB
// Mock process.memoryUsage
process.memoryUsage = mock(() => ({
rss: 100 * 1024 * 1024, // 100MB
heapTotal: 50 * 1024 * 1024, // 50MB
heapUsed: 30 * 1024 * 1024, // 30MB
external: 10 * 1024 * 1024, // 10MB
arrayBuffers: 5 * 1024 * 1024, // 5MB
}));
// Mock process.env
process.env.npm_package_version = "2.1.0";
});
afterEach(() => {
// Restore original os functions
os.platform = originalPlatform;
os.version = originalVersion;
os.arch = originalArch;
os.totalmem = originalTotalmem;
os.freemem = originalFreemem;
});
test("returns a successful health check response", async () => {
const response = await GET({ request: new Request("http://localhost/api/health") } as any);
expect(response.status).toBe(200);
const data = await response.json();
// Check the structure of the response
expect(data.status).toBe("ok");
expect(data.timestamp).toBeDefined();
expect(data.version).toBe("2.1.0");
// Check database status
expect(data.database.connected).toBe(true);
// Check system info
expect(data.system.os.platform).toBe("test-platform");
expect(data.system.os.version).toBe("test-version");
expect(data.system.os.arch).toBe("test-arch");
// Check memory info
expect(data.system.memory.rss).toBe("100 MB");
expect(data.system.memory.heapTotal).toBe("50 MB");
expect(data.system.memory.heapUsed).toBe("30 MB");
expect(data.system.memory.systemTotal).toBe("16 GB");
expect(data.system.memory.systemFree).toBe("8 GB");
// Check uptime
expect(data.system.uptime.startTime).toBeDefined();
expect(data.system.uptime.uptimeMs).toBeGreaterThanOrEqual(0);
expect(data.system.uptime.formatted).toBeDefined();
});
test("handles database connection failures", async () => {
// Mock database failure
mock.module("@/lib/db", () => {
return {
db: {
select: () => ({
from: () => ({
limit: () => Promise.reject(new Error("Database connection error"))
})
})
}
};
});
// Mock console.error to prevent test output noise
const originalConsoleError = console.error;
console.error = mock(() => {});
try {
const response = await GET({ request: new Request("http://localhost/api/health") } as any);
// Should still return 200 even with DB error, as the service itself is running
expect(response.status).toBe(200);
const data = await response.json();
// Status should still be ok since the service is running
expect(data.status).toBe("ok");
// Database should show as disconnected
expect(data.database.connected).toBe(false);
expect(data.database.message).toBe("Database connection error");
} finally {
// Restore console.error
console.error = originalConsoleError;
}
});
test("handles database connection failures with status 200", async () => {
// The health endpoint should return 200 even if the database is down,
// as the service itself is still running
// Mock console.error to prevent test output noise
const originalConsoleError = console.error;
console.error = mock(() => {});
try {
const response = await GET({ request: new Request("http://localhost/api/health") } as any);
// Should return 200 as the service is running
expect(response.status).toBe(200);
const data = await response.json();
// Status should be ok
expect(data.status).toBe("ok");
// Database should show as disconnected
expect(data.database.connected).toBe(false);
} finally {
// Restore console.error
console.error = originalConsoleError;
}
});
});