diff --git a/frontend/src/pages/TechniqueDetailPage.tsx b/frontend/src/pages/TechniqueDetailPage.tsx
index c575fb3..a3513bf 100644
--- a/frontend/src/pages/TechniqueDetailPage.tsx
+++ b/frontend/src/pages/TechniqueDetailPage.tsx
@@ -158,6 +158,10 @@ export default function TechniqueDetailPage() {
const canReview =
user?.role === "admin" || user?.role === "red_lead" || user?.role === "blue_lead";
+ // Same roles that can create tests (mirrors backend POST /tests/from-template)
+ const canRunTemplate =
+ user?.role === "admin" || user?.role === "red_lead" || user?.role === "blue_lead";
+
const {
data: technique,
isLoading,
@@ -584,7 +588,7 @@ export default function TechniqueDetailPage() {
View test
- ) : (
+ ) : canRunTemplate ? (
- )}
+ ) : null}
);
diff --git a/frontend/src/pages/TestCatalogPage.tsx b/frontend/src/pages/TestCatalogPage.tsx
index 14a3077..b82db71 100644
--- a/frontend/src/pages/TestCatalogPage.tsx
+++ b/frontend/src/pages/TestCatalogPage.tsx
@@ -14,6 +14,7 @@ import {
import { getTemplates } from "../api/test-templates";
import TestFromTemplateForm from "../components/TestFromTemplateForm";
import type { TestTemplateSummary } from "../types/models";
+import { useAuth } from "../context/AuthContext";
// ── Constants ──────────────────────────────────────────────────────
@@ -75,6 +76,13 @@ export default function TestCatalogPage() {
const navigate = useNavigate();
const { templateId } = useParams<{ templateId: string }>();
const [searchParams, setSearchParams] = useSearchParams();
+ const { user } = useAuth();
+
+ // Only leads and admins can create tests from templates
+ const canUseTemplate =
+ user?.role === "admin" ||
+ user?.role === "red_lead" ||
+ user?.role === "blue_lead";
const [search, setSearch] = useState(searchParams.get("search") || "");
const [source, setSource] = useState(searchParams.get("source") || "");
@@ -236,6 +244,7 @@ export default function TestCatalogPage() {
navigate(`/test-catalog/${tpl.id}/use`)}
/>
))}
@@ -286,9 +295,11 @@ export default function TestCatalogPage() {
function TemplateCard({
template,
+ canUse,
onUse,
}: {
template: TestTemplateSummary;
+ canUse: boolean;
onUse: () => void;
}) {
return (
@@ -341,14 +352,16 @@ function TemplateCard({
{/* Spacer */}
- {/* Action */}
-
+ {/* Action — only visible to users who can create tests */}
+ {canUse && (
+
+ )}
);
}