Przeglądaj źródła

improve ConfigLoader.loadFromDB

Yuki Takei 11 miesięcy temu
rodzic
commit
243f7efcc5

+ 43 - 0
apps/app/src/server/service/config-manager/config-loader.spec.ts

@@ -35,5 +35,48 @@ describe('ConfigLoader', () => {
         expect(config['app:referrerPolicy'].value).toBe(null);
         expect(config['app:referrerPolicy'].value).toBe(null);
       });
       });
     });
     });
+
+    describe('when doc.value is invalid JSON', () => {
+      beforeEach(() => {
+        const mockDocs = [
+          { key: 'app:referrerPolicy' as ConfigKey, value: '{invalid:json' },
+        ];
+        mockExec.mockResolvedValue(mockDocs);
+      });
+
+      it('should return null for value', async() => {
+        const config: RawConfigData<ConfigKey, ConfigValues> = await configLoader.loadFromDB();
+        expect(config['app:referrerPolicy'].value).toBe(null);
+      });
+    });
+
+    describe('when doc.value is valid JSON', () => {
+      const validJson = { key: 'value' };
+      beforeEach(() => {
+        const mockDocs = [
+          { key: 'app:referrerPolicy' as ConfigKey, value: JSON.stringify(validJson) },
+        ];
+        mockExec.mockResolvedValue(mockDocs);
+      });
+
+      it('should return parsed value', async() => {
+        const config: RawConfigData<ConfigKey, ConfigValues> = await configLoader.loadFromDB();
+        expect(config['app:referrerPolicy'].value).toEqual(validJson);
+      });
+    });
+
+    describe('when doc.value is null', () => {
+      beforeEach(() => {
+        const mockDocs = [
+          { key: 'app:referrerPolicy' as ConfigKey, value: null },
+        ];
+        mockExec.mockResolvedValue(mockDocs);
+      });
+
+      it('should return null for value', async() => {
+        const config: RawConfigData<ConfigKey, ConfigValues> = await configLoader.loadFromDB();
+        expect(config['app:referrerPolicy'].value).toBe(null);
+      });
+    });
   });
   });
 });
 });

+ 8 - 1
apps/app/src/server/service/config-manager/config-loader.ts

@@ -44,7 +44,14 @@ export class ConfigLoader implements IConfigLoader<ConfigKey, ConfigValues> {
     for (const doc of docs) {
     for (const doc of docs) {
       dbConfig[doc.key as ConfigKey] = {
       dbConfig[doc.key as ConfigKey] = {
         definition: (doc.key in CONFIG_DEFINITIONS) ? CONFIG_DEFINITIONS[doc.key as ConfigKey] : undefined,
         definition: (doc.key in CONFIG_DEFINITIONS) ? CONFIG_DEFINITIONS[doc.key as ConfigKey] : undefined,
-        value: doc.value != null && doc.value !== '' ? JSON.parse(doc.value) : null,
+        value: doc.value != null ? (() => {
+          try {
+            return JSON.parse(doc.value);
+          }
+          catch {
+            return null;
+          }
+        })() : null,
       };
       };
     }
     }