Skip to content

Testnizer v1.5.4

Latest

Choose a tag to compare

@apinizerdev apinizerdev released this 22 Sep 12:39
· 273 commits to main since this release
7bd10b7

v1.5.4

Git sync that survives two machines, a Clone from Git that actually lands,
and updates that download in the background and ask only when they are ready.

  • Git sync across machines (issues #132, #133, #130, #127): the RC test
    round drove the whole flow on two computers — branch, merge, push, pull — and
    found that it did not converge. Pull only merged the checked-out branch, so a
    merge a teammate pushed to main never reached your local main while you
    sat on a feature branch; and after git merge the database still held the
    pre-merge state, which the next Push exported over the merged file and
    shipped — the merge vanished from the remote even when done in the right
    order. Pull now syncs the project (every local branch fast-forwards to its
    remote counterpart), switching to a branch a teammate advanced fast-forwards
    it, and switch / merge write the database to the checkout first and read the
    result back afterwards. The project file is a set of rows, not a document, so
    two branches that each added a request no longer end in a text-level
    conflict whose only resolution threw one side away: conflicted project files
    are merged by row (additions kept, one-sided changes taken, both-sided
    changes decided by the newer edit, a change beats a stale delete) and only a
    file the merge cannot read still reaches the mine / theirs dialog. Deletions
    finally propagate — a request removed on one machine no longer comes back on
    the other's Pull, and its Push no longer resurrects it. A project rename now
    travels with the repository, so both machines keep writing the same file;
    before, each wrote its own <name>.json and read only its own. Clone from
    Git
    landed the remote's rows under the wrong project id on the second
    machine (issue #130), and on the same machine refused with a message naming
    the internal project name — "My Project", which no screen shows (issue
    #133). Rows are bound to the importing project; the one-repository-per-local-
    project rule is checked before a project is created and names the project
    the way the Hub does. A wrong PAT no longer leaves a poisoned empty
    repository behind, the token never enters a URL or .git/config, and Push
    fails with a clear message instead of "Invalid username or token" (issue
    #127).

  • Git edge cases found on a real remote: a first Push to an empty
    repository, a repository created with master while the project says main,
    a Pull before anyone has pushed, a repository whose default branch no longer
    exists, and a checkout folder that only holds desktop.ini all reach the same
    state as a clean clone. Push used to retire every other tracked .json in
    the folder — a second project sharing the repository, a team's notes.json —
    and now retires only this project's own previous file. Renaming the project
    made Push commit nothing while reporting success; it commits.

  • Updates download in the background (issue #134): the update dialog used
    to appear the moment a newer version was merely available, before anything
    was downloaded, and background download was off — every check interrupted
    you and still needed a click. Updates now download silently; when one is
    ready, Testnizer comes forward and a small card in the corner asks Restart
    & install
    , Install on quit, or Skip this version. Nothing is modal;
    closing the card means "on quit". A skipped version is neither downloaded nor
    offered again in the background (Settings → Check for Updates can still
    install it), and — the part that mattered — it is no longer installed on the
    next quit behind your back. A failed install brings up the dialog with the
    error and a manual-download link rather than staying silent.

  • Saved responses become examples (issue #125): Save response now stores
    the request that produced it — both the editor template with {{variables}}
    intact and the resolved request that went over the wire, with credential
    headers masked — and lists the example under its request in the APIs tree.
    An example opens in its own read-only tab (Sent / Original toggle, the saved
    response below); rename and delete work from the tree and from the Saved tab
    alike; examples travel through export, import and Git.

  • Editing and saving (issues #122, #124, #126, #123): Cmd/Ctrl+S refreshes
    the APIs tree, so a method change shows on the request's badge without
    reopening anything; the Save button next to Send takes the same path and now
    keeps SOAP, WebSocket, gRPC and GraphQL metadata like Ctrl+S already did. A
    manual SOAP request no longer reopens with empty URL, operation and body
    after Save (Send had been using the saved values all along), and the Runner
    sends manual SOAP with the right Content-Type / SOAPAction. The project
    root can be renamed from the tree. The search box and folder state of the
    APIs panel are no longer shared between project tabs. A pm.variables.set
    in a pre-request script now resolves on Send exactly as it does on Run.

  • AI Chat (issues #120, #121): user-defined HTTP headers are supported and
    validated (an invalid one is named, its value never shown), and the Send
    button no longer demands an API key for providers that do not use one.

Tests: the suite grew to 3867 across 320 files. The git work is covered by
two suites that run against a real bare repository with real git, one
in-memory database per "machine" and no mocks — the reporter's nine-step
two-device flow verbatim, the other merge order, switch without Pull, deletion
propagation, unpushed rows surviving a Pull, push-rejected → Pull → Push,
fresh-machine clone, same-machine refusal, empty and master-only remotes,
create / delete / remote-only branches, a conflict the row merge declines
(ours, theirs, abort), rename propagation, the wizard's inspection step and
the Save dialog's push / pull sharing a remote with the checkout. The row
merge has its own unit suite. The background update flow is covered in the
store, in the main-process install-on-quit switch, and by an e2e spec that
injects the updater events into the built app and checks that the card, not a
dialog, appears — and only once the download is done.

Still deferred: main-process git error strings are Turkish regardless of
UI language (main has no i18n); the Save dialog's own Pull still imports
additively; installing the update at quit time is exercised by unit tests
only, since tests have no update server.