Flatten threads: fix for application/json+protobuf responses
When a new message is created in a thread, the thread itself is
reloaded, but via an application/json+protobuf request (array-like data)
instead of a regular text/plain request (object-like data). Since the
code didn't work well for these types of requests, the thread didn't
fully load.
This CL fixes this issue by correctly handling application/json+protobuf
responses in the response modifiers.
An issue with the read-only interceptors has also been fixed, and tests
have been added to ensure that the array-like to object-like and
viceversa transformation functions work properly.
Bug: twpowertools:153
Change-Id: If6cd5adc67d676bf36986f325e791124fa71da51
diff --git a/src/common/protojs.test.mjs b/src/common/protojs.test.mjs
new file mode 100644
index 0000000..b5ee44c
--- /dev/null
+++ b/src/common/protojs.test.mjs
@@ -0,0 +1,148 @@
+/* eslint-disable no-sparse-arrays */
+import * as protojs from './protojs.js';
+
+const objectLike1 = {
+ '2': [1, 2, 3],
+};
+
+const arrayLike1 = [
+ undefined,
+ [1, 2, 3],
+];
+
+const rObjectLike1 = [
+ ,
+ undefined,
+ [, 1, 2, 3],
+];
+
+const objectLike2 = {
+ '1': {
+ '1': 12,
+ '2': [
+ {
+ '6': [false, false, false],
+ '7': {
+ '1': false,
+ '2': 'Hola',
+ },
+ },
+ {
+ '6': [true, true, false],
+ '7': {
+ '1': false,
+ '2': 'Test',
+ },
+ },
+ {
+ '6': [],
+ '7': {
+ '1': true,
+ '2': 'Bye',
+ },
+ },
+ ],
+ '3': 1663,
+ },
+};
+
+const arrayLike2 = [[
+ 12,
+ [
+ [
+ undefined, undefined, undefined, undefined, undefined,
+ [false, false, false],
+ [
+ false,
+ 'Hola',
+ ]
+ ],
+ [
+ undefined, undefined, undefined, undefined, undefined,
+ [true, true, false],
+ [
+ false,
+ 'Test',
+ ]
+ ],
+ [
+ undefined, undefined, undefined, undefined, undefined, [],
+ [
+ true,
+ 'Bye',
+ ]
+ ],
+ ],
+ 1663,
+]];
+
+const rObjectLike2 = [, [
+ ,
+ 12,
+ [
+ ,
+ [
+ , undefined, undefined, undefined, undefined, undefined,
+ [, false, false, false],
+ [
+ ,
+ false,
+ 'Hola',
+ ]
+ ],
+ [
+ , undefined, undefined, undefined, undefined, undefined,
+ [, true, true, false],
+ [
+ ,
+ false,
+ 'Test',
+ ]
+ ],
+ [
+ , undefined, undefined, undefined, undefined, undefined, [],
+ [
+ ,
+ true,
+ 'Bye',
+ ]
+ ],
+ ],
+ 1663,
+]];
+
+test('can convert object-like to array-like', () => {
+ // [ object-like input, array-like verified output ]
+ const entries = [
+ [objectLike1, arrayLike1],
+ [rObjectLike1, arrayLike1],
+ [objectLike2, arrayLike2],
+ [rObjectLike2, arrayLike2],
+ ];
+
+ entries.forEach(([input, verifiedOutput]) => {
+ const converted = protojs.inverseCorrectArrayKeys(input);
+ expect(converted).toStrictEqual(verifiedOutput);
+ });
+});
+
+test('can convert array-like to object-like', () => {
+ // [ array-like input, object-like verified output ]
+ const entries = [
+ [arrayLike1, rObjectLike1],
+ [arrayLike2, rObjectLike2],
+ ];
+
+ entries.forEach(([input, verifiedOutput]) => {
+ const converted = protojs.correctArrayKeys(input);
+ expect(converted).toStrictEqual(verifiedOutput);
+ });
+});
+
+test('empty object can be converted to array-like form', () => {
+ const object = {
+ 1: {},
+ };
+ const converted = protojs.inverseCorrectArrayKeys(object);
+ expect(converted).toStrictEqual([[]]);
+});