123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202 |
- import 'reflect-metadata'
- import { LogSessionUserAgentOption, MuteSignInEmailsOption, SettingName } from '@standardnotes/settings'
- import { Logger } from 'winston'
- import { EncryptionVersion } from '../Encryption/EncryptionVersion'
- import { User } from '../User/User'
- import { Setting } from './Setting'
- import { SettingRepositoryInterface } from './SettingRepositoryInterface'
- import { SettingService } from './SettingService'
- import { SettingsAssociationServiceInterface } from './SettingsAssociationServiceInterface'
- import { SettingInterpreterInterface } from './SettingInterpreterInterface'
- import { SettingDecrypterInterface } from './SettingDecrypterInterface'
- import { SettingFactoryInterface } from './SettingFactoryInterface'
- describe('SettingService', () => {
- let setting: Setting
- let user: User
- let factory: SettingFactoryInterface
- let settingRepository: SettingRepositoryInterface
- let settingsAssociationService: SettingsAssociationServiceInterface
- let settingInterpreter: SettingInterpreterInterface
- let settingDecrypter: SettingDecrypterInterface
- let logger: Logger
- const createService = () =>
- new SettingService(
- factory,
- settingRepository,
- settingsAssociationService,
- settingInterpreter,
- settingDecrypter,
- logger,
- )
- beforeEach(() => {
- user = {
- uuid: '4-5-6',
- } as jest.Mocked<User>
- user.isPotentiallyAPrivateUsernameAccount = jest.fn().mockReturnValue(false)
- setting = {
- name: SettingName.NAMES.DropboxBackupToken,
- } as jest.Mocked<Setting>
- factory = {} as jest.Mocked<SettingFactoryInterface>
- factory.create = jest.fn().mockReturnValue(setting)
- factory.createReplacement = jest.fn().mockReturnValue(setting)
- settingRepository = {} as jest.Mocked<SettingRepositoryInterface>
- settingRepository.findLastByNameAndUserUuid = jest.fn().mockReturnValue(null)
- settingRepository.findOneByNameAndUserUuid = jest.fn().mockReturnValue(null)
- settingRepository.save = jest.fn().mockImplementation((setting) => setting)
- settingsAssociationService = {} as jest.Mocked<SettingsAssociationServiceInterface>
- settingsAssociationService.getDefaultSettingsAndValuesForNewUser = jest.fn().mockReturnValue(
- new Map([
- [
- SettingName.NAMES.MuteSignInEmails,
- {
- value: MuteSignInEmailsOption.NotMuted,
- sensitive: 0,
- serverEncryptionVersion: EncryptionVersion.Unencrypted,
- },
- ],
- ]),
- )
- settingsAssociationService.getDefaultSettingsAndValuesForNewPrivateUsernameAccount = jest.fn().mockReturnValue(
- new Map([
- [
- SettingName.NAMES.LogSessionUserAgent,
- {
- sensitive: false,
- serverEncryptionVersion: EncryptionVersion.Unencrypted,
- value: LogSessionUserAgentOption.Disabled,
- },
- ],
- ]),
- )
- settingInterpreter = {} as jest.Mocked<SettingInterpreterInterface>
- settingInterpreter.interpretSettingUpdated = jest.fn()
- settingDecrypter = {} as jest.Mocked<SettingDecrypterInterface>
- settingDecrypter.decryptSettingValue = jest.fn().mockReturnValue('decrypted')
- logger = {} as jest.Mocked<Logger>
- logger.debug = jest.fn()
- logger.warn = jest.fn()
- logger.error = jest.fn()
- })
- it('should create default settings for a newly registered user', async () => {
- await createService().applyDefaultSettingsUponRegistration(user)
- expect(settingRepository.save).toHaveBeenCalledWith(setting)
- })
- it('should create default settings for a newly registered vault account', async () => {
- user.isPotentiallyAPrivateUsernameAccount = jest.fn().mockReturnValue(true)
- await createService().applyDefaultSettingsUponRegistration(user)
- expect(settingRepository.save).toHaveBeenCalledWith(setting)
- })
- it("should create setting if it doesn't exist", async () => {
- const result = await createService().createOrReplace({
- user,
- props: {
- name: SettingName.NAMES.MuteFailedBackupsEmails,
- unencryptedValue: 'value',
- serverEncryptionVersion: 1,
- sensitive: false,
- },
- })
- expect(result.status).toEqual('created')
- })
- it('should throw error if setting name is not valid', async () => {
- await expect(
- createService().createOrReplace({
- user,
- props: {
- name: 'invalid',
- unencryptedValue: 'value',
- serverEncryptionVersion: 1,
- sensitive: false,
- },
- }),
- ).rejects.toThrowError('Invalid setting name: invalid')
- })
- it('should create setting with a given uuid if it does not exist', async () => {
- settingRepository.findOneByUuid = jest.fn().mockReturnValue(null)
- const result = await createService().createOrReplace({
- user,
- props: {
- uuid: '1-2-3',
- name: SettingName.NAMES.MuteFailedBackupsEmails,
- unencryptedValue: 'value',
- serverEncryptionVersion: 1,
- sensitive: false,
- },
- })
- expect(result.status).toEqual('created')
- })
- it('should replace setting if it does exist', async () => {
- settingRepository.findLastByNameAndUserUuid = jest.fn().mockReturnValue(setting)
- const result = await createService().createOrReplace({
- user: user,
- props: {
- ...setting,
- unencryptedValue: 'value',
- serverEncryptionVersion: 1,
- },
- })
- expect(result.status).toEqual('replaced')
- })
- it('should replace setting with a given uuid if it does exist', async () => {
- settingRepository.findOneByUuid = jest.fn().mockReturnValue(setting)
- const result = await createService().createOrReplace({
- user: user,
- props: {
- ...setting,
- uuid: '1-2-3',
- unencryptedValue: 'value',
- serverEncryptionVersion: 1,
- },
- })
- expect(result.status).toEqual('replaced')
- })
- it('should find and decrypt the value of a setting for user', async () => {
- setting = {
- value: 'encrypted',
- serverEncryptionVersion: EncryptionVersion.Default,
- } as jest.Mocked<Setting>
- settingRepository.findLastByNameAndUserUuid = jest.fn().mockReturnValue(setting)
- expect(
- await createService().findSettingWithDecryptedValue({
- userUuid: '1-2-3',
- settingName: SettingName.create(SettingName.NAMES.LogSessionUserAgent).getValue(),
- }),
- ).toEqual({
- serverEncryptionVersion: 1,
- value: 'decrypted',
- })
- })
- })
|