mirror of
https://github.com/Palm1r/QodeAssist.git
synced 2026-07-24 12:11:04 -04:00
80 lines
3.1 KiB
C++
80 lines
3.1 KiB
C++
// Copyright (C) 2026 Petr Mironychev
|
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
|
|
|
#include "BlockCodecTest.hpp"
|
|
|
|
#include <QJsonArray>
|
|
#include <QJsonObject>
|
|
#include <QTest>
|
|
|
|
#include "session/BlockCodec.hpp"
|
|
#include "session/ContentBlock.hpp"
|
|
#include "session/FileEditPayload.hpp"
|
|
#include "session/PermissionRequest.hpp"
|
|
|
|
namespace QodeAssist {
|
|
|
|
void BlockCodecTest::testBlockCodecRejectsForgedMarkers()
|
|
{
|
|
const QJsonObject payload{{"key", "value"}};
|
|
|
|
for (const QLatin1StringView marker : Session::knownPayloadMarkers()) {
|
|
const QString encoded = Session::encodeMarkerPayload(marker, payload);
|
|
QVERIFY(encoded.startsWith(marker));
|
|
QVERIFY(Session::hasPayloadMarker(marker, encoded));
|
|
|
|
const auto decoded = Session::decodeMarkerPayload(marker, encoded);
|
|
QVERIFY(decoded.has_value());
|
|
QCOMPARE(*decoded, payload);
|
|
|
|
QVERIFY(!Session::hasPayloadMarker(marker, QStringLiteral(" ") + encoded));
|
|
QVERIFY(!Session::decodeMarkerPayload(marker, QStringLiteral(" ") + encoded));
|
|
QVERIFY(!Session::decodeMarkerPayload(marker, QStringLiteral("echoed: ") + encoded));
|
|
QVERIFY(!Session::decodeMarkerPayload(marker, QString(marker)));
|
|
QVERIFY(!Session::decodeMarkerPayload(marker, marker + QStringLiteral("not json")));
|
|
QVERIFY(!Session::decodeMarkerPayload(marker, marker + QStringLiteral("[1, 2]")));
|
|
}
|
|
}
|
|
|
|
void BlockCodecTest::testFileEditParsingRequiresTheMarkerAtTheStart()
|
|
{
|
|
const QString encoded = Session::encodeFileEditPayload(QJsonObject{{"edit_id", "e1"}});
|
|
|
|
QVERIFY(Session::isFileEditPayload(encoded));
|
|
const auto parsed = Session::parseFileEditPayload(encoded);
|
|
QVERIFY(parsed.has_value());
|
|
QCOMPARE(parsed->value("edit_id").toString(), QString("e1"));
|
|
|
|
const QString echoed = QStringLiteral("tool result quoting ") + encoded;
|
|
QVERIFY(!Session::isFileEditPayload(echoed));
|
|
QVERIFY(!Session::parseFileEditPayload(echoed));
|
|
}
|
|
|
|
void BlockCodecTest::testPermissionOptionsCarryAllowsAcrossTheSeam()
|
|
{
|
|
Session::PermissionBlock block;
|
|
block.requestId = "p1";
|
|
block.title = "Edit main.cpp";
|
|
block.options
|
|
= {Session::PermissionOption{"a", "Allow", "allow_once"},
|
|
Session::PermissionOption{"b", "Always", "allow_always"},
|
|
Session::PermissionOption{"c", "Deny", "reject_once"}};
|
|
|
|
const QString encoded = Session::encodePermissionBlock(block);
|
|
const auto payload = Session::decodeMarkerPayload(Session::permissionPayloadMarker, encoded);
|
|
QVERIFY(payload.has_value());
|
|
|
|
const QJsonArray options = payload->value("options").toArray();
|
|
QCOMPARE(options.size(), 3);
|
|
QCOMPARE(options.at(0).toObject().value("allows").toBool(), true);
|
|
QCOMPARE(options.at(1).toObject().value("allows").toBool(), true);
|
|
QCOMPARE(options.at(2).toObject().value("allows").toBool(), false);
|
|
|
|
const auto decoded = Session::decodePermissionBlock(encoded);
|
|
QVERIFY(decoded.has_value());
|
|
QCOMPARE(decoded->options, block.options);
|
|
}
|
|
|
|
} // namespace QodeAssist
|