fix blank screen on load

This commit is contained in:
2026-08-10 23:39:45 +08:00
parent bba448e329
commit 6e0b0c92d1
5 changed files with 69 additions and 4 deletions
+3
View File
@@ -10,6 +10,9 @@ FROM rust:1.88-bookworm AS backend
WORKDIR /build
COPY Cargo.toml Cargo.lock* ./
COPY src ./src
COPY tests ./tests
COPY fixtures ./fixtures
COPY Dockerfile compose.example.yml ./
COPY --from=frontend /build/frontend/dist ./frontend/dist
RUN cargo test --release && cargo build --release --bin minecraft-log-viewer
+22
View File
@@ -0,0 +1,22 @@
import { afterEach, describe, expect, it, vi } from "vitest";
describe("application entry point", () => {
afterEach(() => {
vi.unstubAllGlobals();
document.body.innerHTML = "";
});
it("mounts the Svelte application", async () => {
document.body.innerHTML = '<div id="app"></div>';
vi.stubGlobal(
"fetch",
vi.fn(() => new Promise(() => {})),
);
await import("./main");
expect(document.querySelector("header strong")?.textContent).toBe(
"Connecting",
);
});
});
+11 -1
View File
@@ -1 +1,11 @@
import './style.css';import App from './App.svelte';new App({target:document.getElementById('app')!});
import "./style.css";
import { mount } from "svelte";
import App from "./App.svelte";
const target = document.getElementById("app");
if (!target) {
throw new Error("Missing #app mount target");
}
mount(App, { target });
+7 -3
View File
@@ -1,3 +1,7 @@
import { defineConfig } from 'vitest/config';
import { svelte } from '@sveltejs/vite-plugin-svelte';
export default defineConfig({ plugins: [svelte()], test: { environment: 'jsdom' } });
import { defineConfig } from "vitest/config";
import { svelte } from "@sveltejs/vite-plugin-svelte";
export default defineConfig({
plugins: [svelte()],
resolve: { conditions: ["browser"] },
test: { environment: "jsdom" },
});
+26
View File
@@ -85,6 +85,32 @@ fn request(peer: &str) -> Request<axum::body::Body> {
request
}
#[tokio::test]
async fn frontend_security_policy_allows_its_external_assets() {
let (app, _dir, _tx) = app().await;
let mut request = Request::builder()
.uri("/")
.body(axum::body::Body::empty())
.unwrap();
request.extensions_mut().insert(ConnectInfo(
"203.0.113.4:5000".parse::<SocketAddr>().unwrap(),
));
let response = app.oneshot(request).await.unwrap();
assert_eq!(response.status(), StatusCode::OK);
assert_eq!(
response.headers()[header::CONTENT_SECURITY_POLICY],
"default-src 'self'; connect-src 'self' ws: wss:; style-src 'self'; script-src 'self'; frame-ancestors 'none'"
);
let body = axum::body::to_bytes(response.into_body(), 8192)
.await
.unwrap();
let html = String::from_utf8(body.to_vec()).unwrap();
assert!(html.contains("rel=\"stylesheet\""));
assert!(!html.contains("<style"));
}
#[tokio::test]
async fn authorized_direct_ip_receives_redacted_logs() {
let (app, _dir, _tx) = app().await;