|
|
@@ -25,3 +25,52 @@ TEST_F(ApiFixture, BadKeyRejected) {
|
|
|
auto r = http("not-a-real-key").Get("/api/v1/projects");
|
|
|
ASSERT_TRUE(r); EXPECT_EQ(r->status, 401);
|
|
|
}
|
|
|
+
|
|
|
+TEST_F(ApiFixture, ProjectsListCreateGetDelete) {
|
|
|
+ auto c = admin();
|
|
|
+ auto list0 = c.Get("/api/v1/projects");
|
|
|
+ ASSERT_EQ(list0->status, 200);
|
|
|
+ EXPECT_TRUE(nlohmann::json::parse(list0->body).contains("projects"));
|
|
|
+
|
|
|
+ std::string np = "svapitest_created";
|
|
|
+ db_->dropProject(np); // clean
|
|
|
+ auto cr = c.Post("/api/v1/projects", nlohmann::json{{"name", np}}.dump(), "application/json");
|
|
|
+ ASSERT_TRUE(cr); EXPECT_EQ(cr->status, 201);
|
|
|
+ auto got = c.Get(("/api/v1/projects/" + np).c_str());
|
|
|
+ ASSERT_EQ(got->status, 200);
|
|
|
+ auto del = c.Delete(("/api/v1/projects/" + np).c_str());
|
|
|
+ EXPECT_EQ(del->status, 200);
|
|
|
+ db_->dropProject(np);
|
|
|
+}
|
|
|
+
|
|
|
+TEST_F(ApiFixture, KeysCrudAndScopedAuthz) {
|
|
|
+ auto c = admin();
|
|
|
+ // create a non-admin key scoped to project_
|
|
|
+ auto mk = c.Post("/api/v1/keys",
|
|
|
+ nlohmann::json{{"label","n8n"},{"projects",{project_}},{"admin",false}}.dump(), "application/json");
|
|
|
+ ASSERT_TRUE(mk); ASSERT_EQ(mk->status, 201);
|
|
|
+ std::string scopedKey = nlohmann::json::parse(mk->body)["key"];
|
|
|
+ ASSERT_FALSE(scopedKey.empty());
|
|
|
+
|
|
|
+ // list masks the secret
|
|
|
+ auto list = c.Get("/api/v1/keys");
|
|
|
+ ASSERT_EQ(list->status, 200);
|
|
|
+ for (auto& k : nlohmann::json::parse(list->body)["keys"]) EXPECT_FALSE(k.contains("key"));
|
|
|
+
|
|
|
+ // scoped key can access its project, but not management or another project
|
|
|
+ EXPECT_EQ(http(scopedKey).Get(("/api/v1/projects/" + project_).c_str())->status, 200);
|
|
|
+ EXPECT_EQ(http(scopedKey).Get("/api/v1/keys")->status, 403); // not admin
|
|
|
+ EXPECT_EQ(http(scopedKey).Get("/api/v1/projects/svapitest_other")->status, 403); // not granted
|
|
|
+
|
|
|
+ EXPECT_EQ(c.Delete(("/api/v1/keys/" + scopedKey).c_str())->status, 200);
|
|
|
+ EXPECT_EQ(http(scopedKey).Get(("/api/v1/projects/" + project_).c_str())->status, 401); // revoked
|
|
|
+}
|
|
|
+
|
|
|
+TEST_F(ApiFixture, NonAdminCannotCreateProject) {
|
|
|
+ auto mk = admin().Post("/api/v1/keys",
|
|
|
+ nlohmann::json{{"label","x"},{"projects",{project_}},{"admin",false}}.dump(), "application/json");
|
|
|
+ std::string scoped = nlohmann::json::parse(mk->body)["key"];
|
|
|
+ auto r = http(scoped).Post("/api/v1/projects", nlohmann::json{{"name","svapitest_nope"}}.dump(), "application/json");
|
|
|
+ ASSERT_TRUE(r); EXPECT_EQ(r->status, 403);
|
|
|
+ admin().Delete(("/api/v1/keys/" + scoped).c_str());
|
|
|
+}
|