@@ -20,6 +20,7 @@ import sinonChai from 'sinon-chai';
20
20
import chaiAsPromised from 'chai-as-promised' ;
21
21
import { ChromeAdapter } from './chrome-adapter' ;
22
22
import { Availability , LanguageModel } from '../types/language-model' ;
23
+ import { stub } from 'sinon' ;
23
24
24
25
use ( sinonChai ) ;
25
26
use ( chaiAsPromised ) ;
@@ -56,5 +57,81 @@ describe('ChromeAdapter', () => {
56
57
} )
57
58
) . to . be . true ;
58
59
} ) ;
60
+ it ( 'returns false and triggers download when model is available after download' , async ( ) => {
61
+ const languageModelProvider = {
62
+ availability : ( ) => Promise . resolve ( Availability . downloadable ) ,
63
+ create : ( ) => Promise . resolve ( { } )
64
+ } as LanguageModel ;
65
+ const createStub = stub ( languageModelProvider , 'create' ) . resolves (
66
+ { } as LanguageModel
67
+ ) ;
68
+ const adapter = new ChromeAdapter (
69
+ languageModelProvider ,
70
+ 'prefer_on_device'
71
+ ) ;
72
+ expect (
73
+ await adapter . isAvailable ( {
74
+ contents : [ { role : 'user' , parts : [ { text : 'hi' } ] } ]
75
+ } )
76
+ ) . to . be . false ;
77
+ expect ( createStub ) . to . have . been . calledOnce ;
78
+ } ) ;
79
+ it ( 'avoids redundant downloads' , async ( ) => {
80
+ const languageModelProvider = {
81
+ availability : ( ) => Promise . resolve ( Availability . downloadable ) ,
82
+ create : ( ) => Promise . resolve ( { } )
83
+ } as LanguageModel ;
84
+ const downloadPromise = new Promise < LanguageModel > ( ( ) => {
85
+ /* never resolves */
86
+ } ) ;
87
+ const createStub = stub ( languageModelProvider , 'create' ) . returns (
88
+ downloadPromise
89
+ ) ;
90
+ const adapter = new ChromeAdapter ( languageModelProvider ) ;
91
+ await adapter . isAvailable ( {
92
+ contents : [ { role : 'user' , parts : [ { text : 'hi' } ] } ]
93
+ } ) ;
94
+ await adapter . isAvailable ( {
95
+ contents : [ { role : 'user' , parts : [ { text : 'hi' } ] } ]
96
+ } ) ;
97
+ expect ( createStub ) . to . have . been . calledOnce ;
98
+ } ) ;
99
+ it ( 'clears state when download completes' , async ( ) => {
100
+ const languageModelProvider = {
101
+ availability : ( ) => Promise . resolve ( Availability . downloadable ) ,
102
+ create : ( ) => Promise . resolve ( { } )
103
+ } as LanguageModel ;
104
+ let resolveDownload ;
105
+ const downloadPromise = new Promise < LanguageModel > ( resolveCallback => {
106
+ resolveDownload = resolveCallback ;
107
+ } ) ;
108
+ const createStub = stub ( languageModelProvider , 'create' ) . returns (
109
+ downloadPromise
110
+ ) ;
111
+ const adapter = new ChromeAdapter ( languageModelProvider ) ;
112
+ await adapter . isAvailable ( {
113
+ contents : [ { role : 'user' , parts : [ { text : 'hi' } ] } ]
114
+ } ) ;
115
+ resolveDownload ! ( ) ;
116
+ await adapter . isAvailable ( {
117
+ contents : [ { role : 'user' , parts : [ { text : 'hi' } ] } ]
118
+ } ) ;
119
+ expect ( createStub ) . to . have . been . calledTwice ;
120
+ } ) ;
121
+ it ( 'returns false when model is never available' , async ( ) => {
122
+ const languageModelProvider = {
123
+ availability : ( ) => Promise . resolve ( Availability . unavailable ) ,
124
+ create : ( ) => Promise . resolve ( { } )
125
+ } as LanguageModel ;
126
+ const adapter = new ChromeAdapter (
127
+ languageModelProvider ,
128
+ 'prefer_on_device'
129
+ ) ;
130
+ expect (
131
+ await adapter . isAvailable ( {
132
+ contents : [ { role : 'user' , parts : [ { text : 'hi' } ] } ]
133
+ } )
134
+ ) . to . be . false ;
135
+ } ) ;
59
136
} ) ;
60
137
} ) ;
0 commit comments