Beide Bugs in ExpertViewModel.pendingCommand, betreffen Experte-Tab direkt (nicht nur den neuen Übersicht-Bearbeiten-Weg): - Bug 25: ein geleertes Textfeld (z.B. Kommentar löschen) wurde beim Speichern aus den Argumenten gefiltert statt explizit als "" gesendet — RouterOS' `set` ändert nur übergebene Parameter, ein weggelassener bleibt unangetastet statt geleert. Fix: Feld bleibt im Argument-Set, wenn es vorher einen Wert hatte; RouterOSCommand's SSH-Zeilen-Rendering gibt einen leeren Wert jetzt als `""` statt als nacktes `feld=` aus. - Bug 26: eine Route bearbeiten (z.B. nur Kommentar ändern) scheiterte mit "bad parameter immediate-gw" — dieses von RouterOS mitgelieferte, nur lesbare/berechnete Feld landete unkuratiert in den freien "Weiteren Parametern" und wurde bei jedem Speichern blind mitgeschickt. Fix: ein unkuratiertes Feld wird nur noch gesendet, wenn sein Wert sich gegenüber dem ursprünglich geladenen Item tatsächlich geändert hat. 54 Unit-Tests grün (neue ExpertViewModelTests + eine Ergänzung in RouterOSCommandBuilderTests). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YDmUd93KxsYGr2kLTotWnG
44 lines
1.8 KiB
Swift
44 lines
1.8 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: "")
|
|
]
|
|
)
|
|
}
|
|
|
|
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")
|
|
}
|
|
}
|