Skip to content

Commit

Permalink
[cloud_firestore_web] Ensure Query pagination methods encode values. (#…
Browse files Browse the repository at this point in the history
…2166)

This change ensures that the package:firestore Query objects are created with properly encoded values when done so from the start/end (pagination) methods.

This also adds some Timestamps to the unit tests to verify the behavior of Timestamp -> DateTime in the web implementation.

(There are some integration tests in cloud_firestore that cover this behavior further.)

Fixes #2153

* [cloud_firestore_platform_interface] Fix 'equal_keys_in_map' lint (unrelated fix, but this change triggered an analysis in a sibling package)
  • Loading branch information
ditman authored Mar 19, 2020
1 parent 3fc3ca8 commit bd9bcd4
Show file tree
Hide file tree
Showing 5 changed files with 56 additions and 31 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -1018,7 +1018,6 @@ void main() {
'app': app.name,
'path': 'bar',
'isCollectionGroup': true,
'source': 'default',
'parameters': <String, dynamic>{
'where': <List<dynamic>>[],
'orderBy': <List<dynamic>>[],
Expand All @@ -1036,7 +1035,6 @@ void main() {
'app': app.name,
'path': 'bar',
'isCollectionGroup': true,
'source': 'default',
'parameters': <String, dynamic>{
'where': <List<dynamic>>[],
'orderBy': <List<dynamic>>[],
Expand Down
4 changes: 4 additions & 0 deletions packages/cloud_firestore/cloud_firestore_web/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
## 0.1.1+2

* Ensure QueryWeb correctly encodes values passed in to `[start|end][At|Before](Document?)` methods.

## 0.1.1+1

* Ensure FieldValueFactoryWeb correctly encodes parameters for arrayRemove/arrayUnion FieldValues.
Expand Down
35 changes: 23 additions & 12 deletions packages/cloud_firestore/cloud_firestore_web/lib/src/query_web.dart
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,9 @@ class QueryWeb extends QueryPlatform {
QueryPlatform endAt(List values) => QueryWeb(
this._firestore,
this._path,
_webQuery != null ? _webQuery.endAt(fieldValues: values) : null,
_webQuery != null
? _webQuery.endAt(fieldValues: CodecUtility.valueEncode(values))
: null,
isCollectionGroup: _isCollectionGroup,
);

Expand All @@ -73,16 +75,20 @@ class QueryWeb extends QueryPlatform {
this._firestore,
this._path,
_webQuery.endAt(
fieldValues:
_orderByKeys.map((key) => documentSnapshot.data[key]).toList()),
fieldValues: CodecUtility.valueEncode(
_orderByKeys.map((key) => documentSnapshot.data[key]).toList(),
),
),
isCollectionGroup: _isCollectionGroup);
}

@override
QueryPlatform endBefore(List values) => QueryWeb(
this._firestore,
this._path,
_webQuery != null ? _webQuery.endBefore(fieldValues: values) : null,
_webQuery != null
? _webQuery.endBefore(fieldValues: CodecUtility.valueEncode(values))
: null,
isCollectionGroup: _isCollectionGroup,
);

Expand All @@ -93,8 +99,10 @@ class QueryWeb extends QueryPlatform {
this._firestore,
this._path,
_webQuery.endBefore(
fieldValues:
_orderByKeys.map((key) => documentSnapshot.data[key]).toList()),
fieldValues: CodecUtility.valueEncode(
_orderByKeys.map((key) => documentSnapshot.data[key]).toList(),
),
),
isCollectionGroup: _isCollectionGroup);
}

Expand Down Expand Up @@ -144,7 +152,7 @@ class QueryWeb extends QueryPlatform {
QueryPlatform startAfter(List values) => QueryWeb(
this._firestore,
this._path,
_webQuery.startAfter(fieldValues: values),
_webQuery.startAfter(fieldValues: CodecUtility.valueEncode(values)),
orderByKeys: _orderByKeys,
isCollectionGroup: _isCollectionGroup,
);
Expand All @@ -156,8 +164,10 @@ class QueryWeb extends QueryPlatform {
this._firestore,
this._path,
_webQuery.startAfter(
fieldValues:
_orderByKeys.map((key) => documentSnapshot.data[key]).toList()),
fieldValues: CodecUtility.valueEncode(
_orderByKeys.map((key) => documentSnapshot.data[key]).toList(),
),
),
orderByKeys: _orderByKeys,
isCollectionGroup: _isCollectionGroup);
}
Expand All @@ -166,7 +176,7 @@ class QueryWeb extends QueryPlatform {
QueryPlatform startAt(List values) => QueryWeb(
this._firestore,
this._path,
_webQuery.startAt(fieldValues: values),
_webQuery.startAt(fieldValues: CodecUtility.valueEncode(values)),
orderByKeys: _orderByKeys,
isCollectionGroup: _isCollectionGroup,
);
Expand All @@ -178,8 +188,9 @@ class QueryWeb extends QueryPlatform {
this._firestore,
this._path,
_webQuery.startAt(
fieldValues:
_orderByKeys.map((key) => documentSnapshot.data[key]).toList(),
fieldValues: CodecUtility.valueEncode(
_orderByKeys.map((key) => documentSnapshot.data[key]).toList(),
),
),
orderByKeys: _orderByKeys,
isCollectionGroup: _isCollectionGroup,
Expand Down
2 changes: 1 addition & 1 deletion packages/cloud_firestore/cloud_firestore_web/pubspec.yaml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
name: cloud_firestore_web
description: The web implementation of cloud_firestore
homepage: https://github.com/FirebaseExtended/flutterfire/tree/master/packages/cloud_firestore/cloud_firestore_web
version: 0.1.1+1
version: 0.1.1+2

flutter:
plugin:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,67 +86,79 @@ void main() {
});

test("endAt", () {
query.endAt([]);
verify(mockWebQuery.endAt(fieldValues: anyNamed("fieldValues")));
query.endAt([Timestamp.now()]);
verify(mockWebQuery.endAt(
fieldValues:
argThat(contains(isA<DateTime>()), named: "fieldValues")));
});

test("endAtDocument", () {
final DateTime date = DateTime.now();
final mockDocumentSnapshot = MockDocumentSnapshot();
when(mockDocumentSnapshot.data).thenReturn({
'test': 1,
'test': Timestamp.fromDate(date),
});
query.orderBy("test");
query.endAtDocument(mockDocumentSnapshot);
verify(mockWebQuery.endAt(
fieldValues: argThat(equals([1]), named: "fieldValues")));
fieldValues: argThat(equals([date]), named: "fieldValues")));
});

test("endBefore", () {
query.endBefore([]);
verify(mockWebQuery.endBefore(fieldValues: anyNamed("fieldValues")));
query.endBefore([Timestamp.now()]);
verify(mockWebQuery.endBefore(
fieldValues:
argThat(contains(isA<DateTime>()), named: "fieldValues")));
});

test("endBeforeDocument", () {
final DateTime date = DateTime.now();
final mockDocumentSnapshot = MockDocumentSnapshot();
when(mockDocumentSnapshot.data).thenReturn({
'test': 1,
'test': Timestamp.fromDate(date),
});
query.orderBy("test");
query.endBeforeDocument(mockDocumentSnapshot);
verify(mockWebQuery.endBefore(
fieldValues: argThat(equals([1]), named: "fieldValues")));
fieldValues: argThat(equals([date]), named: "fieldValues")));
});

test("startAfter", () {
query.startAfter([]);
verify(mockWebQuery.startAfter(fieldValues: anyNamed("fieldValues")));
query.startAfter([Timestamp.now()]);
verify(mockWebQuery.startAfter(
fieldValues:
argThat(contains(isA<DateTime>()), named: "fieldValues")));
});

test("startAfterDocument", () {
final DateTime date = DateTime.now();
final mockDocumentSnapshot = MockDocumentSnapshot();
when(mockDocumentSnapshot.data).thenReturn({
'test': 1,
'test': Timestamp.fromDate(date),
});
query.orderBy("test");
query.startAfterDocument(mockDocumentSnapshot);
verify(mockWebQuery.startAfter(
fieldValues: argThat(equals([1]), named: "fieldValues")));
fieldValues: argThat(equals([date]), named: "fieldValues")));
});

test("startAt", () {
query.startAt([]);
verify(mockWebQuery.startAt(fieldValues: anyNamed("fieldValues")));
query.startAt([Timestamp.now()]);
verify(mockWebQuery.startAt(
fieldValues:
argThat(contains(isA<DateTime>()), named: "fieldValues")));
});

test("startAtDocument", () {
final DateTime date = DateTime.now();
final mockDocumentSnapshot = MockDocumentSnapshot();
when(mockDocumentSnapshot.data).thenReturn({
'test': 1,
'test': Timestamp.fromDate(date),
});
query.orderBy("test");
query.startAtDocument(mockDocumentSnapshot);
verify(mockWebQuery.startAt(
fieldValues: argThat(equals([1]), named: "fieldValues")));
fieldValues: argThat(equals([date]), named: "fieldValues")));
});

test("limit", () {
Expand Down

0 comments on commit bd9bcd4

Please sign in to comment.