|
|
@@ -928,3 +928,36 @@ TEST_F(ApiFixture, IndexCreateRequiresField) {
|
|
|
auto bad = c.Post((base + "/idxv/indexes").c_str(), nlohmann::json{}.dump(), "application/json");
|
|
|
ASSERT_TRUE(bad); EXPECT_EQ(bad->status, 422);
|
|
|
}
|
|
|
+
|
|
|
+TEST_F(ApiFixture, UniqueIndexRejectsExistingDuplicates) {
|
|
|
+ auto c = admin();
|
|
|
+ std::string base = "/api/v1/projects/" + project_ + "/collections";
|
|
|
+ ASSERT_EQ(c.Post(base.c_str(), nlohmann::json{{"name","uq"},{"kind","json"}}.dump(),
|
|
|
+ "application/json")->status, 201);
|
|
|
+ std::string docs = base + "/uq/documents";
|
|
|
+ ASSERT_EQ(c.Post(docs.c_str(), nlohmann::json{{"sku","A1"}}.dump(), "application/json")->status, 201);
|
|
|
+ ASSERT_EQ(c.Post(docs.c_str(), nlohmann::json{{"sku","A1"}}.dump(), "application/json")->status, 201);
|
|
|
+
|
|
|
+ auto conflict = c.Post((base + "/uq/indexes").c_str(),
|
|
|
+ nlohmann::json{{"field","sku"},{"unique",true}}.dump(), "application/json");
|
|
|
+ ASSERT_TRUE(conflict); EXPECT_EQ(conflict->status, 409);
|
|
|
+ auto body = nlohmann::json::parse(conflict->body);
|
|
|
+ EXPECT_EQ(body["error"]["code"], "duplicate_values");
|
|
|
+ ASSERT_TRUE(body["error"]["details"].contains("duplicate_examples"));
|
|
|
+ EXPECT_GE(body["error"]["details"]["duplicate_examples"].size(), 1u);
|
|
|
+}
|
|
|
+
|
|
|
+TEST_F(ApiFixture, UniqueIndexOnCleanFieldSucceeds) {
|
|
|
+ auto c = admin();
|
|
|
+ std::string base = "/api/v1/projects/" + project_ + "/collections";
|
|
|
+ ASSERT_EQ(c.Post(base.c_str(), nlohmann::json{{"name","uq2"},{"kind","json"}}.dump(),
|
|
|
+ "application/json")->status, 201);
|
|
|
+ std::string docs = base + "/uq2/documents";
|
|
|
+ ASSERT_EQ(c.Post(docs.c_str(), nlohmann::json{{"sku","B1"}}.dump(), "application/json")->status, 201);
|
|
|
+ ASSERT_EQ(c.Post(docs.c_str(), nlohmann::json{{"sku","B2"}}.dump(), "application/json")->status, 201);
|
|
|
+
|
|
|
+ auto made = c.Post((base + "/uq2/indexes").c_str(),
|
|
|
+ nlohmann::json{{"field","sku"},{"unique",true}}.dump(), "application/json");
|
|
|
+ ASSERT_TRUE(made); EXPECT_EQ(made->status, 201);
|
|
|
+ EXPECT_TRUE(nlohmann::json::parse(made->body)["unique"].get<bool>());
|
|
|
+}
|