Mock Components

Purpose and Scope

This document describes the mock implementations of WebView platform components used for testing the mesh-flutter-sdk without requiring actual WebView functionality. These mocks enable unit testing of the SDK's core logic, event processing, and controller behavior in a controlled environment.

Mock Architecture Overview

The SDK provides a complete mock implementation of the webview_flutter_platform_interface to support testing without platform dependencies. The mock system consists of four components that mirror the real WebView platform architecture:

Simulation Capabilities

SDK Components Under Test

Mock Platform Components

Test Environment

Creates and configures

Creates

Creates

Creates

Injects mocks into

Uses

Uses

Displays

Calls

Triggers callbacks in

Provides

Asserts against

Test Cases

MockWebViewPlatform

MockWebViewController

MockNavigationDelegate

MockWebViewWidget

MeshLinkController

MeshLinkPage

simulateJsMessage()

State Tracking

MockWebViewController

MockWebViewController is the central mock component that simulates PlatformWebViewController behavior. It provides mechanisms to simulate JavaScript messages and track state changes for assertions.

Class Structure


«interface»

PlatformWebViewController

MockWebViewController

-_onMessageReceived Function

-_backgroundColor Color

-_javaScriptMode JavaScriptMode

-_javaScriptChannel String

-_requestUri Uri

-_lastJavaScript String

+backgroundColor Color

+javaScriptMode JavaScriptMode

+javaScriptChannel String

+requestUri Uri

+lastJavaScript String

+simulateJsMessage(String)

+setBackgroundColor(Color)

+setJavaScriptMode(JavaScriptMode)

+addJavaScriptChannel(JavaScriptChannelParams)

+setPlatformNavigationDelegate(PlatformNavigationDelegate)

+loadRequest(LoadRequestParams)

+runJavaScript(String)

Key Properties and Methods

Property/Method Type Purpose
simulateJsMessage(String) Method Simulates receiving a JavaScript message through the JSBridge channel
backgroundColor Getter Returns the currently set background color
javaScriptMode Getter Returns the currently set JavaScript execution mode
javaScriptChannel Getter Returns the name of the registered JavaScript channel
requestUri Getter Returns the last URI loaded via loadRequest()
lastJavaScript Getter Returns the last JavaScript code executed via runJavaScript()

JavaScript Message Simulation

The simulateJsMessage() method enables tests to inject JavaScript messages as if they came from the web content:

"MeshLinkController""onMessageReceived""MockWebViewController""Test Case""MeshLinkController""onMessageReceived""MockWebViewController""Test Case""addJavaScriptChannel(params)""Store _onMessageReceived""simulateJsMessage(json)""Call with JavaScriptMessage""Process message""Check state changes"

State Tracking

The mock tracks all configuration changes, enabling tests to verify that the controller properly configures the WebView:

Tracked State Setter Method Getter Property Storage Location
Background Color setBackgroundColor() backgroundColor _backgroundColor
JavaScript Mode setJavaScriptMode() javaScriptMode _javaScriptMode
JavaScript Channel addJavaScriptChannel() javaScriptChannel _javaScriptChannel
Loaded URI loadRequest() requestUri _requestUri
Executed JavaScript runJavaScript() lastJavaScript _lastJavaScript

Channel Registration Validation

The mock enforces that only one JavaScript channel can be registered, throwing a StateError if a second channel is added. This matches the expected behavior of the real WebView platform.

MockNavigationDelegate

MockNavigationDelegate provides stub implementations of PlatformNavigationDelegate methods. Unlike MockWebViewController, this mock does not track state or provide simulation capabilities—it simply accepts callback registrations without error.

Interface Implementation


«interface»

PlatformNavigationDelegate

+setOnNavigationRequest()

+setOnWebResourceError()

+setOnUrlChange()

+setOnHttpAuthRequest()

+setOnHttpError()

MockNavigationDelegate

+setOnNavigationRequest()

+setOnWebResourceError()

+setOnUrlChange()

+setOnHttpAuthRequest()

+setOnHttpError()

Supported Callbacks

All callback registration methods are implemented as no-ops:

Method Purpose Implementation
setOnNavigationRequest() Register navigation request handler Empty async method
setOnWebResourceError() Register resource error handler Empty async method
setOnUrlChange() Register URL change handler Empty async method
setOnHttpAuthRequest() Register HTTP auth handler Empty async method
setOnHttpError() Register HTTP error handler Empty async method

MockWebViewWidget

MockWebViewWidget is a minimal Flutter widget that renders as plain text instead of an actual WebView. This allows UI tests to verify widget structure without requiring WebView rendering capabilities.

Widget Implementation

The widget extends PlatformWebViewWidget and returns a simple Text widget:

returns

«abstract»

PlatformWebViewWidget

+build(BuildContext) : Widget

MockWebViewWidget

+build(BuildContext) : Widget

«Flutter Widget»

Text

MockWebViewPlatform

MockWebViewPlatform acts as a factory that returns pre-configured mock instances instead of creating real platform implementations. This component ties the entire mock system together.

Constructor and Fields

The constructor requires all three mock instances to be provided:

MockWebViewPlatform({
  required this.webViewController,
  required this.navigationDelegate,
  required this.mockWebViewWidget,
})

Factory Methods

Factory Method Returns Implementation
createPlatformWebViewController() PlatformWebViewController Returns stored webViewController field
createPlatformNavigationDelegate() PlatformNavigationDelegate Returns stored navigationDelegate field
createPlatformWebViewWidget() PlatformWebViewWidget Returns stored mockWebViewWidget field

Mock Component Limitations

The mock implementations have intentional limitations that align with their testing purpose:

Component Limitation Rationale
MockNavigationDelegate Does not store or invoke callbacks Navigation logic is tested indirectly through controller behavior
MockWebViewWidget Does not render actual web content Widget structure tests don't require rendering
MockWebViewController No automatic page load simulation Tests must explicitly call simulateJsMessage() to trigger events
MockWebViewController Single channel enforcement Prevents test setup errors where multiple channels are registered