Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
## NEXT

* Gracefully bypasses `HeatmapLayer` instantiation and operations when unsupported by the loaded Google Maps JavaScript API (version 3.65+), preventing runtime web crashes.
* Updates minimum supported SDK version to Flutter 3.38/Dart 3.10.

## 0.6.2+1
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,12 @@ import 'dart:js_interop';
import 'package:flutter_test/flutter_test.dart';
import 'package:google_maps/google_maps.dart' as gmaps;
import 'package:google_maps/google_maps_visualization.dart' as visualization;
import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart';
import 'package:google_maps_flutter_web/google_maps_flutter_web.dart';
import 'package:integration_test/integration_test.dart';
import 'package:web/web.dart' as web;

import 'shared_mocks.dart';

/// Test Shapes (Circle, Polygon, Polyline)
void main() {
Expand Down Expand Up @@ -203,47 +207,82 @@ void main() {
});

group('HeatmapController', () {
late visualization.HeatmapLayer heatmap;
group('Heatmap on Google Maps JS SDK v3.64 (Supported)', () {
late visualization.HeatmapLayer heatmap;

setUp(() {
heatmap = visualization.HeatmapLayer();
});
setUp(() {
injectMockHeatmapLayer();
mockVisualizationLibrary();

testWidgets('update', (WidgetTester tester) async {
final controller = HeatmapController(heatmap: heatmap);
final options = visualization.HeatmapLayerOptions()
..data = <gmaps.LatLng>[gmaps.LatLng(0, 0)].toJS;
heatmap = visualization.HeatmapLayer();
});

expect(heatmap.data.array.toDart, hasLength(0));
tearDown(() {
restoreVisualizationLibrary();
});

controller.update(options);
testWidgets('update', (WidgetTester tester) async {
final controller = HeatmapController(heatmap: heatmap);
final options = visualization.HeatmapLayerOptions()
..data = <gmaps.LatLng>[gmaps.LatLng(0, 0)].toJS;

expect(heatmap.data.array.toDart, hasLength(1));
});
expect(heatmap.data.array.toDart, hasLength(0));

group('remove', () {
late HeatmapController controller;
controller.update(options);

setUp(() {
controller = HeatmapController(heatmap: heatmap);
expect(heatmap.data.array.toDart, hasLength(1));
});

testWidgets('drops gmaps instance', (WidgetTester tester) async {
controller.remove();
group('remove', () {
late HeatmapController controller;

expect(controller.heatmap, isNull);
setUp(() {
controller = HeatmapController(heatmap: heatmap);
});

testWidgets('drops gmaps instance', (WidgetTester tester) async {
controller.remove();

expect(controller.heatmap, isNull);
});

testWidgets('cannot call update after remove', (
WidgetTester tester,
) async {
final options = visualization.HeatmapLayerOptions()
..dissipating = true;

controller.remove();

expect(() {
controller.update(options);
}, throwsAssertionError);
});
});
});

testWidgets('cannot call update after remove', (
group('Heatmap on Google Maps JS SDK v3.65 (Unsupported)', () {
testWidgets('gracefully bypasses and logs warning exactly once', (
WidgetTester tester,
) async {
final options = visualization.HeatmapLayerOptions()..dissipating = true;

controller.remove();

expect(() {
controller.update(options);
}, throwsAssertionError);
final controller = HeatmapsController();
final map = gmaps.Map(
web.document.createElement('div') as web.HTMLDivElement,
);
controller.bindToMap(123, map);

final heatmaps = <Heatmap>{
const Heatmap(
heatmapId: HeatmapId('1'),
data: <WeightedLatLng>[],
radius: HeatmapRadius.fromPixels(20),
),
};

controller.addHeatmaps(heatmaps);

expect(controller.heatmaps.isEmpty, isTrue);
expect(controller.pendingHeatmaps.length, 1);
});
});
});
Expand Down
Loading