forked from kay/RouterOS
Gleiche Ursache wie Bug 26, aber bei einem kuratierten statt einem
unkuratierten Feld: eine dynamische/verbundene Route hat distance=0,
RouterOS akzeptiert das nur system-intern, nicht als expliziten Eingabe-
wert für "set" — auch wenn der Wert unverändert zurückgesendet wird
("value of distance out of range (1...255)").
Fix generalisiert das "nur bei Änderung senden"-Prinzip aus Bug 26 von
unkuratierten auf ALLE Felder beim Bearbeiten eines bestehenden Items:
pendingCommand diffed jetzt gegen das ursprünglich geladene Item, statt
kuratierte Felder immer komplett neu zu senden. Deckt implizit auch das
Leeren eines Feldes ab (Bug 25), dessen Sonderfall dadurch überflüssig
wurde und entfernt ist.
Nebenbei: ExpertViewModelTests.swift lief bisher gar nicht mit, weil
nach dem Anlegen der Datei kein "xcodegen generate" lief (Xcodegen
erzeugt die Sources-Dateiliste einmalig beim Generieren). Nach erneutem
Generate 58 Unit-Tests grün.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YDmUd93KxsYGr2kLTotWnG
58 lines
2.6 KiB
Swift
58 lines
2.6 KiB
Swift
import XCTest
|
|
@testable import RouterOSAssistant
|
|
|
|
@MainActor
|
|
final class ExpertViewModelTests: XCTestCase {
|
|
private func makeSchema() -> RouterOSMenuSchema {
|
|
RouterOSMenuSchema(
|
|
menuPath: "/ip route", restPath: "ip/route", category: .routing,
|
|
displayName: "Test", summary: "", explanation: "",
|
|
fields: [
|
|
RouterOSFieldSchema(key: "comment", label: "Kommentar", kind: .text, help: ""),
|
|
RouterOSFieldSchema(key: "distance", label: "Distanz", kind: .int, help: "")
|
|
]
|
|
)
|
|
}
|
|
|
|
func testClearingACuratedFieldSendsExplicitEmptyValue() {
|
|
let viewModel = ExpertViewModel(connectionService: ConnectionService())
|
|
viewModel.selectedSchema = makeSchema()
|
|
viewModel.startEditing(RouterOSMenuItem(id: "*1", fields: ["comment": "bridge"]))
|
|
viewModel.formValues["comment"] = ""
|
|
|
|
XCTAssertEqual(viewModel.pendingCommand?.arguments["comment"], "")
|
|
}
|
|
|
|
func testUnchangedUncuratedFieldIsNotResent() {
|
|
let viewModel = ExpertViewModel(connectionService: ConnectionService())
|
|
viewModel.selectedSchema = makeSchema()
|
|
viewModel.startEditing(RouterOSMenuItem(id: "*1", fields: ["comment": "", "immediate-gw": "192.168.88.1"]))
|
|
viewModel.formValues["comment"] = "bridge"
|
|
|
|
XCTAssertNil(viewModel.pendingCommand?.arguments["immediate-gw"])
|
|
XCTAssertEqual(viewModel.pendingCommand?.arguments["comment"], "bridge")
|
|
}
|
|
|
|
func testChangedUncuratedFieldIsSent() {
|
|
let viewModel = ExpertViewModel(connectionService: ConnectionService())
|
|
viewModel.selectedSchema = makeSchema()
|
|
viewModel.startEditing(RouterOSMenuItem(id: "*1", fields: ["comment": "", "note": "old"]))
|
|
viewModel.extraFields = [.init(key: "note", value: "new")]
|
|
|
|
XCTAssertEqual(viewModel.pendingCommand?.arguments["note"], "new")
|
|
}
|
|
|
|
/// A dynamic/connected route's distance=0 is only valid as-is — RouterOS rejects it if
|
|
/// resent verbatim on a `set` ("value of distance out of range (1...255)"), even when the
|
|
/// value itself hasn't changed. Editing only the comment must not resend it.
|
|
func testUnchangedCuratedFieldIsNotResentEvenIfOutOfNormalRange() {
|
|
let viewModel = ExpertViewModel(connectionService: ConnectionService())
|
|
viewModel.selectedSchema = makeSchema()
|
|
viewModel.startEditing(RouterOSMenuItem(id: "*1", fields: ["comment": "", "distance": "0"]))
|
|
viewModel.formValues["comment"] = "bridge"
|
|
|
|
XCTAssertNil(viewModel.pendingCommand?.arguments["distance"])
|
|
XCTAssertEqual(viewModel.pendingCommand?.arguments["comment"], "bridge")
|
|
}
|
|
}
|