Skip to content

Commit

Permalink
added tests (#647)
Browse files Browse the repository at this point in the history
  • Loading branch information
StekPerepolnen authored Dec 22, 2023
1 parent 6b4f46a commit 0e45751
Show file tree
Hide file tree
Showing 2 changed files with 72 additions and 4 deletions.
11 changes: 7 additions & 4 deletions ydb/core/viewer/json_query.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ class TJsonQuery : public TViewerPipeClient<TJsonQuery> {
TString Stats;
TString Syntax;
TString UserToken;
bool IsBase64Encode;

enum ESchemaType {
Classic,
Expand Down Expand Up @@ -85,6 +86,7 @@ class TJsonQuery : public TViewerPipeClient<TJsonQuery> {
Schema = StringToSchemaType(schemaStr);
Syntax = params.Get("syntax");
Direct = FromStringWithDefault<bool>(params.Get("direct"), Direct);
IsBase64Encode = FromStringWithDefault<bool>(params.Get("base64"), true);
}

void ParsePostContent(const TStringBuf& content) {
Expand Down Expand Up @@ -252,7 +254,7 @@ class TJsonQuery : public TViewerPipeClient<TJsonQuery> {
}

private:
static NJson::TJsonValue ColumnPrimitiveValueToJsonValue(NYdb::TValueParser& valueParser) {
NJson::TJsonValue ColumnPrimitiveValueToJsonValue(NYdb::TValueParser& valueParser) {
switch (valueParser.GetPrimitiveType()) {
case NYdb::EPrimitiveType::Bool:
return valueParser.GetBool();
Expand Down Expand Up @@ -293,7 +295,7 @@ class TJsonQuery : public TViewerPipeClient<TJsonQuery> {
case NYdb::EPrimitiveType::TzTimestamp:
return valueParser.GetTzTimestamp();
case NYdb::EPrimitiveType::String:
return Base64Encode(valueParser.GetString());
return IsBase64Encode ? Base64Encode(valueParser.GetString()) : valueParser.GetString();
case NYdb::EPrimitiveType::Yson:
return valueParser.GetYson();
case NYdb::EPrimitiveType::Json:
Expand All @@ -307,7 +309,7 @@ class TJsonQuery : public TViewerPipeClient<TJsonQuery> {
}
}

static NJson::TJsonValue ColumnValueToJsonValue(NYdb::TValueParser& valueParser) {
NJson::TJsonValue ColumnValueToJsonValue(NYdb::TValueParser& valueParser) {
switch (valueParser.GetKind()) {
case NYdb::TTypeParser::ETypeKind::Primitive:
return ColumnPrimitiveValueToJsonValue(valueParser);
Expand Down Expand Up @@ -603,7 +605,7 @@ class TJsonQuery : public TViewerPipeClient<TJsonQuery> {
NYdb::TResultSetParser rsParser(resultSet);
while (rsParser.TryNextRow()) {
NJson::TJsonValue& jsonRow = jsonResults.AppendValue({});
TString row = NYdb::FormatResultRowJson(rsParser, columnsMeta, NYdb::EBinaryStringEncoding::Base64);
TString row = NYdb::FormatResultRowJson(rsParser, columnsMeta, IsBase64Encode ? NYdb::EBinaryStringEncoding::Base64 : NYdb::EBinaryStringEncoding::Unicode);
NJson::ReadJsonTree(row, &jsonRow);
}
}
Expand Down Expand Up @@ -633,6 +635,7 @@ struct TJsonRequestParameters<TJsonQuery> {
{"name":"schema","in":"query","description":"result format schema (classic, modern, ydb, multi)","required":false,"type":"string"},
{"name":"stats","in":"query","description":"return stats (profile)","required":false,"type":"string"},
{"name":"action","in":"query","description":"execute method (execute-scan, execute-script, execute-query, execute-data,explain-ast, explain-scan, explain-script, explain-query, explain-data)","required":false,"type":"string"},
{"name":"base64","in":"query","description":"return strings using base64 encoding","required":false,"type":"string"},
{"name":"timeout","in":"query","description":"timeout in ms","required":false,"type":"integer"}])___";
}
};
Expand Down
65 changes: 65 additions & 0 deletions ydb/core/viewer/viewer_ut.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -451,4 +451,69 @@ Y_UNIT_TEST_SUITE(Viewer) {
#endif
#endif
}

NJson::TJsonValue SendQuery(const TString& query, const TString& schema, const bool base64) {
TPortManager tp;
ui16 port = tp.GetPort(2134);
ui16 grpcPort = tp.GetPort(2135);
auto settings = TServerSettings(port);
settings.InitKikimrRunConfig()
.SetNodeCount(1)
.SetUseRealThreads(false)
.SetDomainName("Root");
TServer server(settings);
server.EnableGRpc(grpcPort);
TClient client(settings);
TTestActorRuntime& runtime = *server.GetRuntime();

TActorId sender = runtime.AllocateEdgeActor();
TAutoPtr<IEventHandle> handle;

THttpRequest httpReq(HTTP_METHOD_GET);
httpReq.CgiParameters.emplace("schema", schema);
httpReq.CgiParameters.emplace("base64", base64 ? "true" : "false");
httpReq.CgiParameters.emplace("query", query);
auto page = MakeHolder<TMonPage>("viewer", "title");
TMonService2HttpRequest monReq(nullptr, &httpReq, nullptr, page.Get(), "/json/query", nullptr);
auto request = MakeHolder<NMon::TEvHttpInfo>(monReq);

runtime.Send(new IEventHandle(NKikimr::NViewer::MakeViewerID(0), sender, request.Release(), 0));
NMon::TEvHttpInfoRes* result = runtime.GrabEdgeEvent<NMon::TEvHttpInfoRes>(handle);

size_t pos = result->Answer.find('{');
TString jsonResult = result->Answer.substr(pos);
Ctest << "json result: " << jsonResult << Endl;
NJson::TJsonValue json;
try {
NJson::ReadJsonTree(jsonResult, &json, true);
}
catch (yexception ex) {
Ctest << ex.what() << Endl;
}
return json;
}

void QueryTest(const TString& query, const bool base64, const TString& reply) {
NJson::TJsonValue result = SendQuery(query, "classic", base64);
UNIT_ASSERT_VALUES_EQUAL(result.GetMap().at("column0").GetString(), reply);

result = SendQuery(query, "ydb", base64);
UNIT_ASSERT_VALUES_EQUAL(result.GetMap().at("result").GetArray()[0].GetMap().at("column0").GetString(), reply);

result = SendQuery(query, "modern", base64);
UNIT_ASSERT_VALUES_EQUAL(result.GetMap().at("result").GetArray()[0].GetArray()[0].GetString(), reply);

result = SendQuery(query, "multi", base64);
UNIT_ASSERT_VALUES_EQUAL(result.GetMap().at("result").GetArray()[0].GetMap().at("rows").GetArray()[0].GetArray()[0].GetString(), reply);
}

Y_UNIT_TEST(SelectStringWithBase64Encoding)
{
QueryTest("select \"Hello\"", true, "SGVsbG8=");
}

Y_UNIT_TEST(SelectStringWithNoBase64Encoding)
{
QueryTest("select \"Hello\"", false, "Hello");
}
}

0 comments on commit 0e45751

Please sign in to comment.