forked from kay/RouterOS
M17: "Bekannte Router" im Verbinden-Tab (SavedRouter/SavedRoutersStore), Standort-Freitextfeld, Scroll-Cap ab 4 Einträgen. Bugfix: Umbenennen- TextField steckte in einem sich selbst deaktivierenden Button. M18: Live-Traffic-Punkt an Interfaces (InterfaceTrafficMonitor, eigene SSH-Verbindung, monitor-traffic-Polling). Dabei zwei reale CLI-Parser-Bugs gefunden und gefixt: running/disabled-Flags werden als Buchstaben vor dem ersten Feld codiert, nicht als key=value; monitor-traffic liefert "50.7kbps" statt einer reinen Zahl. M19: Übersicht-Tab — animierte Flussrichtung auf allen Verbindungslinien (TimelineView+dashPhase), frei verschiebbare Knoten mit Live-folgenden Linien, Zurücksetzen-Button. Zusätzlich (noch nicht live getestet, nur Build+Unit-Tests grün): LAN-Port-Konflikt-Prüfung im Einrichten-Assistenten mit doppelter Sicherheitsbestätigung, "Fertig"-Button nach erfolgreichem Anwenden. 82 Tests grün. HANDOFF.md/README.md/Manual.md/CHATLOG.md aktualisiert. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YDmUd93KxsYGr2kLTotWnG
33 lines
1.5 KiB
Swift
33 lines
1.5 KiB
Swift
import XCTest
|
|
@testable import RouterOSAssistant
|
|
|
|
final class PortConflictTests: XCTestCase {
|
|
func testBridgeMembershipProducesNoResolutionCommand() {
|
|
// DhcpServerCommandBuilder already unconditionally detaches any bridge membership —
|
|
// repeating it here would just be a harmless duplicate at best, so it's deliberately
|
|
// excluded from this list.
|
|
let conflict = PortConflict(interfaceName: "ether4", reasons: [.bridgeMember(bridgeName: "bridge")])
|
|
XCTAssertTrue(conflict.resolutionCommands().isEmpty)
|
|
}
|
|
|
|
func testExistingAddressIsRemovedByInterfaceMatch() {
|
|
let conflict = PortConflict(interfaceName: "ether4", reasons: [.hasAddresses(["10.0.0.1/24"])])
|
|
let commands = conflict.resolutionCommands()
|
|
|
|
XCTAssertEqual(commands.count, 1)
|
|
XCTAssertEqual(commands[0].menuPath, "/ip address")
|
|
XCTAssertEqual(commands[0].operation, .remove(matchField: "interface", matchValue: "ether4"))
|
|
}
|
|
|
|
func testDhcpClientAndPppoeClientAreBothRemoved() {
|
|
let conflict = PortConflict(interfaceName: "ether1", reasons: [.dhcpClient, .pppoeClient])
|
|
let commands = conflict.resolutionCommands()
|
|
|
|
XCTAssertEqual(commands.count, 2)
|
|
XCTAssertEqual(commands[0].menuPath, "/ip dhcp-client")
|
|
XCTAssertEqual(commands[0].operation, .remove(matchField: "interface", matchValue: "ether1"))
|
|
XCTAssertEqual(commands[1].menuPath, "/interface pppoe-client")
|
|
XCTAssertEqual(commands[1].operation, .remove(matchField: "interface", matchValue: "ether1"))
|
|
}
|
|
}
|