1+ /*
2+ * SPDX-FileCopyrightText: 2026 LibreSign contributors
3+ * SPDX-License-Identifier: AGPL-3.0-or-later
4+ */
5+
6+ import { beforeEach , describe , expect , it , vi } from 'vitest'
7+ import { mount } from '@vue/test-utils'
8+
9+ import SignatureEngine from '../../../views/Settings/SignatureEngine.vue'
10+
11+ const loadStateMock = vi . fn ( )
12+ const emitMock = vi . fn ( )
13+
14+ vi . mock ( '@nextcloud/initial-state' , ( ) => ( {
15+ loadState : ( ...args : unknown [ ] ) => loadStateMock ( ...args ) ,
16+ } ) )
17+
18+ vi . mock ( '@nextcloud/event-bus' , ( ) => ( {
19+ emit : ( ...args : unknown [ ] ) => emitMock ( ...args ) ,
20+ } ) )
21+
22+ vi . mock ( '@nextcloud/l10n' , ( ) => ( {
23+ t : vi . fn ( ( _app : string , text : string ) => text ) ,
24+ translate : vi . fn ( ( _app : string , text : string ) => text ) ,
25+ translatePlural : vi . fn ( ( _app : string , singular : string , plural : string , count : number ) => ( count === 1 ? singular : plural ) ) ,
26+ n : vi . fn ( ( _app : string , singular : string , plural : string , count : number ) => ( count === 1 ? singular : plural ) ) ,
27+ getLanguage : vi . fn ( ( ) => 'en' ) ,
28+ getLocale : vi . fn ( ( ) => 'en' ) ,
29+ isRTL : vi . fn ( ( ) => false ) ,
30+ } ) )
31+
32+ const OCP = {
33+ AppConfig : {
34+ setValue : vi . fn ( ) ,
35+ } ,
36+ }
37+
38+ ; ( globalThis as typeof globalThis & { OCP : typeof OCP } ) . OCP = OCP
39+
40+ describe ( 'SignatureEngine.vue' , ( ) => {
41+ beforeEach ( ( ) => {
42+ vi . clearAllMocks ( )
43+ loadStateMock . mockImplementation ( ( _app : string , _key : string , fallback : unknown ) => fallback )
44+ } )
45+
46+ function createWrapper ( ) {
47+ return mount ( SignatureEngine , {
48+ global : {
49+ stubs : {
50+ NcSettingsSection : { template : '<div><slot /></div>' } ,
51+ NcSelect : true ,
52+ } ,
53+ } ,
54+ } )
55+ }
56+
57+ it ( 'maps the initial state to the selected option' , ( ) => {
58+ loadStateMock . mockImplementation ( ( _app : string , key : string , fallback : unknown ) => {
59+ if ( key === 'signature_engine' ) return 'PhpNative'
60+ return fallback
61+ } )
62+
63+ const wrapper = createWrapper ( )
64+
65+ expect ( wrapper . vm . selectedOption ) . toEqual ( { id : 'PhpNative' , label : 'Native' } )
66+ } )
67+
68+ it ( 'updates the selected engine through the computed setter' , ( ) => {
69+ const wrapper = createWrapper ( )
70+
71+ wrapper . vm . selectedOption = { id : 'PhpNative' , label : 'Native' }
72+
73+ expect ( wrapper . vm . selectedEngineId ) . toBe ( 'PhpNative' )
74+ } )
75+
76+ it ( 'persists the engine and emits the change event on success' , async ( ) => {
77+ OCP . AppConfig . setValue . mockImplementation ( ( _app : string , _key : string , _value : string , callbacks : { success : ( ) => void } ) => callbacks . success ( ) )
78+ const wrapper = createWrapper ( )
79+
80+ await wrapper . vm . saveEngine ( { id : 'PhpNative' , label : 'Native' } )
81+
82+ expect ( OCP . AppConfig . setValue ) . toHaveBeenCalledWith ( 'libresign' , 'signature_engine' , 'PhpNative' , expect . any ( Object ) )
83+ expect ( emitMock ) . toHaveBeenCalledWith ( 'libresign:signature-engine:changed' , 'PhpNative' )
84+ } )
85+ } )
0 commit comments