Skip to content

Commit 0e45751

Browse files
added tests (#647)
1 parent 6b4f46a commit 0e45751

File tree

2 files changed

+72
-4
lines changed

2 files changed

+72
-4
lines changed

ydb/core/viewer/json_query.h

+7-4
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ class TJsonQuery : public TViewerPipeClient<TJsonQuery> {
4040
TString Stats;
4141
TString Syntax;
4242
TString UserToken;
43+
bool IsBase64Encode;
4344

4445
enum ESchemaType {
4546
Classic,
@@ -85,6 +86,7 @@ class TJsonQuery : public TViewerPipeClient<TJsonQuery> {
8586
Schema = StringToSchemaType(schemaStr);
8687
Syntax = params.Get("syntax");
8788
Direct = FromStringWithDefault<bool>(params.Get("direct"), Direct);
89+
IsBase64Encode = FromStringWithDefault<bool>(params.Get("base64"), true);
8890
}
8991

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

254256
private:
255-
static NJson::TJsonValue ColumnPrimitiveValueToJsonValue(NYdb::TValueParser& valueParser) {
257+
NJson::TJsonValue ColumnPrimitiveValueToJsonValue(NYdb::TValueParser& valueParser) {
256258
switch (valueParser.GetPrimitiveType()) {
257259
case NYdb::EPrimitiveType::Bool:
258260
return valueParser.GetBool();
@@ -293,7 +295,7 @@ class TJsonQuery : public TViewerPipeClient<TJsonQuery> {
293295
case NYdb::EPrimitiveType::TzTimestamp:
294296
return valueParser.GetTzTimestamp();
295297
case NYdb::EPrimitiveType::String:
296-
return Base64Encode(valueParser.GetString());
298+
return IsBase64Encode ? Base64Encode(valueParser.GetString()) : valueParser.GetString();
297299
case NYdb::EPrimitiveType::Yson:
298300
return valueParser.GetYson();
299301
case NYdb::EPrimitiveType::Json:
@@ -307,7 +309,7 @@ class TJsonQuery : public TViewerPipeClient<TJsonQuery> {
307309
}
308310
}
309311

310-
static NJson::TJsonValue ColumnValueToJsonValue(NYdb::TValueParser& valueParser) {
312+
NJson::TJsonValue ColumnValueToJsonValue(NYdb::TValueParser& valueParser) {
311313
switch (valueParser.GetKind()) {
312314
case NYdb::TTypeParser::ETypeKind::Primitive:
313315
return ColumnPrimitiveValueToJsonValue(valueParser);
@@ -603,7 +605,7 @@ class TJsonQuery : public TViewerPipeClient<TJsonQuery> {
603605
NYdb::TResultSetParser rsParser(resultSet);
604606
while (rsParser.TryNextRow()) {
605607
NJson::TJsonValue& jsonRow = jsonResults.AppendValue({});
606-
TString row = NYdb::FormatResultRowJson(rsParser, columnsMeta, NYdb::EBinaryStringEncoding::Base64);
608+
TString row = NYdb::FormatResultRowJson(rsParser, columnsMeta, IsBase64Encode ? NYdb::EBinaryStringEncoding::Base64 : NYdb::EBinaryStringEncoding::Unicode);
607609
NJson::ReadJsonTree(row, &jsonRow);
608610
}
609611
}
@@ -633,6 +635,7 @@ struct TJsonRequestParameters<TJsonQuery> {
633635
{"name":"schema","in":"query","description":"result format schema (classic, modern, ydb, multi)","required":false,"type":"string"},
634636
{"name":"stats","in":"query","description":"return stats (profile)","required":false,"type":"string"},
635637
{"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"},
638+
{"name":"base64","in":"query","description":"return strings using base64 encoding","required":false,"type":"string"},
636639
{"name":"timeout","in":"query","description":"timeout in ms","required":false,"type":"integer"}])___";
637640
}
638641
};

ydb/core/viewer/viewer_ut.cpp

+65
Original file line numberDiff line numberDiff line change
@@ -451,4 +451,69 @@ Y_UNIT_TEST_SUITE(Viewer) {
451451
#endif
452452
#endif
453453
}
454+
455+
NJson::TJsonValue SendQuery(const TString& query, const TString& schema, const bool base64) {
456+
TPortManager tp;
457+
ui16 port = tp.GetPort(2134);
458+
ui16 grpcPort = tp.GetPort(2135);
459+
auto settings = TServerSettings(port);
460+
settings.InitKikimrRunConfig()
461+
.SetNodeCount(1)
462+
.SetUseRealThreads(false)
463+
.SetDomainName("Root");
464+
TServer server(settings);
465+
server.EnableGRpc(grpcPort);
466+
TClient client(settings);
467+
TTestActorRuntime& runtime = *server.GetRuntime();
468+
469+
TActorId sender = runtime.AllocateEdgeActor();
470+
TAutoPtr<IEventHandle> handle;
471+
472+
THttpRequest httpReq(HTTP_METHOD_GET);
473+
httpReq.CgiParameters.emplace("schema", schema);
474+
httpReq.CgiParameters.emplace("base64", base64 ? "true" : "false");
475+
httpReq.CgiParameters.emplace("query", query);
476+
auto page = MakeHolder<TMonPage>("viewer", "title");
477+
TMonService2HttpRequest monReq(nullptr, &httpReq, nullptr, page.Get(), "/json/query", nullptr);
478+
auto request = MakeHolder<NMon::TEvHttpInfo>(monReq);
479+
480+
runtime.Send(new IEventHandle(NKikimr::NViewer::MakeViewerID(0), sender, request.Release(), 0));
481+
NMon::TEvHttpInfoRes* result = runtime.GrabEdgeEvent<NMon::TEvHttpInfoRes>(handle);
482+
483+
size_t pos = result->Answer.find('{');
484+
TString jsonResult = result->Answer.substr(pos);
485+
Ctest << "json result: " << jsonResult << Endl;
486+
NJson::TJsonValue json;
487+
try {
488+
NJson::ReadJsonTree(jsonResult, &json, true);
489+
}
490+
catch (yexception ex) {
491+
Ctest << ex.what() << Endl;
492+
}
493+
return json;
494+
}
495+
496+
void QueryTest(const TString& query, const bool base64, const TString& reply) {
497+
NJson::TJsonValue result = SendQuery(query, "classic", base64);
498+
UNIT_ASSERT_VALUES_EQUAL(result.GetMap().at("column0").GetString(), reply);
499+
500+
result = SendQuery(query, "ydb", base64);
501+
UNIT_ASSERT_VALUES_EQUAL(result.GetMap().at("result").GetArray()[0].GetMap().at("column0").GetString(), reply);
502+
503+
result = SendQuery(query, "modern", base64);
504+
UNIT_ASSERT_VALUES_EQUAL(result.GetMap().at("result").GetArray()[0].GetArray()[0].GetString(), reply);
505+
506+
result = SendQuery(query, "multi", base64);
507+
UNIT_ASSERT_VALUES_EQUAL(result.GetMap().at("result").GetArray()[0].GetMap().at("rows").GetArray()[0].GetArray()[0].GetString(), reply);
508+
}
509+
510+
Y_UNIT_TEST(SelectStringWithBase64Encoding)
511+
{
512+
QueryTest("select \"Hello\"", true, "SGVsbG8=");
513+
}
514+
515+
Y_UNIT_TEST(SelectStringWithNoBase64Encoding)
516+
{
517+
QueryTest("select \"Hello\"", false, "Hello");
518+
}
454519
}

0 commit comments

Comments
 (0)