setBaseUrl() and setSource() used to fire refresh() inline as soon as both `baseUrl` and `source` were populated — but setToken() never triggered a refresh. QML evaluates literal property assignments before bindings to other objects' properties, so a model declared with literal `source` plus bindings to `BackendConnection.url` / `BackendConnection.token` (the exact shape of make:bridge:window's output) could fire its GET *before* the `token` binding had landed. The unauthenticated request hit Symfony's SessionAuthenticator, came back 401, and the model parked at `ready === false` with an empty list. Mercure subscribed anonymously (the model explicitly clears the SSE client's bearer), so subsequent server-side mutations propagated fine — masking the initial-fetch failure as "list is empty until something changes". Hit by the second window in examples/todo. Both classes now implement QQmlParserStatus and trigger the initial refresh from componentComplete(), where every binding (literal *and* singleton-derived) is guaranteed to have landed. After completion, individual setter changes still trigger refresh inline — so token rotation / URL reassignment after first load behave unchanged. Regression test under framework/qml/tests/tst_reactive_list_model.qml using the v0.2.0 qmltestrunner harness. Adds a TestHttpServer helper that mimics SessionAuthenticator's 401-on-no-bearer behaviour so the regression is observable; verified the test fails against the unfixed production code (`Actual: ""` vs `Expected: "Bearer testtoken"` on the captured Authorization header). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
22 lines
896 B
C++
22 lines
896 B
C++
// QML unit-test runner. Bootstraps the Qt Quick Test framework against
|
|
// the `tst_*.qml` files in this directory. Invoked via CMake's
|
|
// `qmltest` test target (CTest) or directly via the produced exe.
|
|
//
|
|
// PLAN.md §13 v0.2.0 testing-strategy row.
|
|
|
|
#include <QtPlugin>
|
|
#include <QtQuickTest/quicktest.h>
|
|
|
|
// Static QML modules need their auto-generated plugin classes pulled
|
|
// in explicitly — the linker would otherwise strip the registration
|
|
// init code because nothing in main() references it. Without these
|
|
// imports the QmlEngine that QUICK_TEST_MAIN spins up can't resolve
|
|
// `import PhpQml.Bridge` / `import PhpQml.Bridge.Tests`.
|
|
//
|
|
// Plugin class names are auto-generated by qt_add_qml_module(STATIC)
|
|
// from the URI: dots become underscores, suffixed with "Plugin".
|
|
Q_IMPORT_PLUGIN(PhpQml_BridgePlugin)
|
|
Q_IMPORT_PLUGIN(PhpQml_Bridge_TestsPlugin)
|
|
|
|
QUICK_TEST_MAIN(qml_unit_tests)
|