|
1 | 1 | // @flow |
2 | | -/* globals describe, expect, test */ |
| 2 | +/* globals describe, expect, test, jest, afterEach */ |
| 3 | +/* eslint-disable import/first */ |
3 | 4 |
|
| 5 | +jest.mock('../../../jgclark.Dashboard/src/perspectiveHelpers', () => ({ |
| 6 | + getActivePerspectiveDef: jest.fn(), |
| 7 | + loadPerspectiveDefsFromPluginSettings: jest.fn(() => Promise.resolve([])), |
| 8 | +})) |
| 9 | + |
| 10 | +import { getActivePerspectiveDef, loadPerspectiveDefsFromPluginSettings } from '../../../jgclark.Dashboard/src/perspectiveHelpers' |
4 | 11 | import { METADATA_TERM_SETTINGS_FOR_RENAME } from '../projectStatus' |
5 | 12 | import { |
6 | 13 | getChangedSettingKeys, |
| 14 | + getReviewSettings, |
7 | 15 | getSettingsUpdateAction, |
8 | 16 | settingsChangeIsOnlyMetadataTermRenames, |
9 | 17 | } from '../reviewSettings' |
@@ -93,6 +101,21 @@ describe('getSettingsUpdateAction', () => { |
93 | 101 | expect(getSettingsUpdateAction(previous, current)).toBe('none') |
94 | 102 | }) |
95 | 103 |
|
| 104 | + test('does nothing when only the log regex changes', () => { |
| 105 | + const { previous, current } = settingsPair({}, { _logFunctionRE: 'onSettingsUpdated' }) |
| 106 | + expect(getSettingsUpdateAction(previous, current)).toBe('none') |
| 107 | + }) |
| 108 | + |
| 109 | + test('does nothing when only the log timer changes', () => { |
| 110 | + const { previous, current } = settingsPair({}, { _logTimer: true }) |
| 111 | + expect(getSettingsUpdateAction(previous, current)).toBe('none') |
| 112 | + }) |
| 113 | + |
| 114 | + test('rebuilds when a metadata-term setting changes alongside the log regex and timer', () => { |
| 115 | + const { previous, current } = settingsPair({}, { startMentionStr: 'begun', _logFunctionRE: '.*', _logTimer: false }) |
| 116 | + expect(getSettingsUpdateAction(previous, current)).toBe('rebuild') |
| 117 | + }) |
| 118 | + |
96 | 119 | test('does nothing when only another command setting changes', () => { |
97 | 120 | const { previous, current } = settingsPair({}, { |
98 | 121 | weeklyProjectProgressBulletSummary: 'Table by sub-folder', |
@@ -138,3 +161,111 @@ describe('settingsChangeIsOnlyMetadataTermRenames', () => { |
138 | 161 | expect(settingsChangeIsOnlyMetadataTermRenames(previous, current, METADATA_TERM_SETTINGS_FOR_RENAME)).toBe(false) |
139 | 162 | }) |
140 | 163 | }) |
| 164 | + |
| 165 | +describe('getReviewSettings', () => { |
| 166 | + const store: any = DataStore |
| 167 | + const originalLoadJSON = store.loadJSON |
| 168 | + const originalSetPreference = store.setPreference |
| 169 | + |
| 170 | + afterEach(() => { |
| 171 | + store.loadJSON = originalLoadJSON |
| 172 | + store.setPreference = originalSetPreference |
| 173 | + }) |
| 174 | + |
| 175 | + /** |
| 176 | + * @param {Object} overrides |
| 177 | + * @returns {Object} |
| 178 | + */ |
| 179 | + function rawSettings(overrides: Object = {}): { [string]: mixed } { |
| 180 | + return { |
| 181 | + usePerspectives: false, |
| 182 | + foldersToInclude: ['Projects'], |
| 183 | + foldersToIgnore: ['Archive'], |
| 184 | + includedTeamspaces: ['private'], |
| 185 | + startMentionStr: 'started', |
| 186 | + completedMentionStr: 'completed', |
| 187 | + cancelledMentionStr: 'cancelled', |
| 188 | + dueMentionStr: 'due', |
| 189 | + reviewIntervalMentionStr: 'review', |
| 190 | + reviewedMentionStr: 'reviewed', |
| 191 | + nextReviewMentionStr: 'nextReview', |
| 192 | + progressStr: 'progress', |
| 193 | + projectTypeTags: ['#project'], |
| 194 | + ...overrides, |
| 195 | + } |
| 196 | + } |
| 197 | + |
| 198 | + test('does not mutate the object loadJSON returned when overlaying a perspective and filling defaults', async () => { |
| 199 | + const loaded = rawSettings({ |
| 200 | + usePerspectives: true, |
| 201 | + useProjectStatus: true, |
| 202 | + }) |
| 203 | + delete loaded.projectMetadataFrontmatterKey |
| 204 | + delete loaded.FFlag_UseCacheOfAllPerspectives |
| 205 | + delete loaded.notstartedMentionStr |
| 206 | + delete loaded.pausedMentionStr |
| 207 | + delete loaded.hiddenStatusTags |
| 208 | + delete loaded.displayPaused |
| 209 | + delete loaded.autoUpdateAfterIdleTime |
| 210 | + delete loaded.reviewsTheme |
| 211 | + delete loaded.hiddenProjectTypeTags |
| 212 | + const before = JSON.parse(JSON.stringify(loaded)) |
| 213 | + const loadPerspectives: any = loadPerspectiveDefsFromPluginSettings |
| 214 | + const getActive: any = getActivePerspectiveDef |
| 215 | + loadPerspectives.mockResolvedValue([{ name: 'Work' }]) |
| 216 | + getActive.mockReturnValue({ |
| 217 | + name: 'Work', |
| 218 | + dashboardSettings: { |
| 219 | + includedFolders: 'Work,Home', |
| 220 | + excludedFolders: 'Archive', |
| 221 | + includedTeamspaces: ['team-1'], |
| 222 | + }, |
| 223 | + }) |
| 224 | + store.loadJSON = jest.fn(() => Promise.resolve(loaded)) |
| 225 | + store.setPreference = jest.fn() |
| 226 | + |
| 227 | + const config = await getReviewSettings() |
| 228 | + if (config == null) { |
| 229 | + throw new Error('getReviewSettings returned null') |
| 230 | + } |
| 231 | + |
| 232 | + expect(loaded).toEqual(before) |
| 233 | + expect(config).not.toBe(loaded) |
| 234 | + expect(config.foldersToInclude).toEqual(['Work', 'Home']) |
| 235 | + expect(config.foldersToIgnore).toEqual(['Archive']) |
| 236 | + expect(config.includedTeamspaces).toEqual(['team-1']) |
| 237 | + expect(config.perspectiveName).toBe('Work') |
| 238 | + expect(config.projectMetadataFrontmatterKey).toBe('project') |
| 239 | + expect(config.FFlag_UseCacheOfAllPerspectives).toBe(false) |
| 240 | + expect(config.notstartedMentionStr).toBe('notstarted') |
| 241 | + expect(config.pausedMentionStr).toBe('paused') |
| 242 | + expect(config.hiddenStatusTags).toEqual(['#completed', '#cancelled']) |
| 243 | + expect(config.displayPaused).toBe(true) |
| 244 | + expect(config.hiddenProjectTypeTags).toEqual([]) |
| 245 | + expect(config.autoUpdateAfterIdleTime).toBe(0) |
| 246 | + expect(config.reviewsTheme).toBe('') |
| 247 | + expect(store.setPreference).toHaveBeenCalledWith('projectMetadataFrontmatterKey', 'project') |
| 248 | + expect(store.setPreference).toHaveBeenCalledWith('useProjectStatus', true) |
| 249 | + }) |
| 250 | + |
| 251 | + test('does not mutate the object loadJSON returned when perspectives are off', async () => { |
| 252 | + const loaded = rawSettings({ |
| 253 | + usePerspectives: false, |
| 254 | + includedTeamspaces: ['team-x'], |
| 255 | + }) |
| 256 | + const before = JSON.parse(JSON.stringify(loaded)) |
| 257 | + store.loadJSON = jest.fn(() => Promise.resolve(loaded)) |
| 258 | + store.setPreference = jest.fn() |
| 259 | + |
| 260 | + const config = await getReviewSettings() |
| 261 | + if (config == null) { |
| 262 | + throw new Error('getReviewSettings returned null') |
| 263 | + } |
| 264 | + |
| 265 | + expect(loaded).toEqual(before) |
| 266 | + expect(config).not.toBe(loaded) |
| 267 | + expect(config.includedTeamspaces).toEqual(['private']) |
| 268 | + expect(config.foldersToInclude).toEqual(['Projects']) |
| 269 | + expect(loaded.includedTeamspaces).toEqual(['team-x']) |
| 270 | + }) |
| 271 | +}) |
0 commit comments