@@ -9,6 +9,7 @@ class FakeElement {
99 this . value = "" ;
1010 this . textContent = "" ;
1111 this . disabled = false ;
12+ this . focused = false ;
1213 }
1314
1415 addEventListener ( type , callback ) {
@@ -18,6 +19,10 @@ class FakeElement {
1819 requestSubmit ( ) {
1920 this . listeners . submit ?. ( { preventDefault ( ) { } } ) ;
2021 }
22+
23+ focus ( ) {
24+ this . focused = true ;
25+ }
2126}
2227
2328const elements = Object . fromEntries (
@@ -47,6 +52,7 @@ class FakeWorker {
4752 }
4853
4954 postMessage ( { id } ) {
55+ if ( mode === "throw" ) throw new Error ( "worker post failed" ) ;
5056 queueMicrotask ( ( ) => {
5157 this . onmessage ?. ( {
5258 data : {
@@ -68,6 +74,7 @@ class FakeWorker {
6874}
6975
7076const copied = [ ] ;
77+ let clipboardFails = false ;
7178globalThis . window = globalThis ;
7279globalThis . Worker = FakeWorker ;
7380globalThis . document = {
@@ -80,6 +87,7 @@ Object.defineProperty(globalThis, "navigator", {
8087 value : {
8188 clipboard : {
8289 writeText ( value ) {
90+ if ( clipboardFails ) throw new Error ( "clipboard denied" ) ;
8391 copied . push ( value ) ;
8492 } ,
8593 } ,
@@ -90,6 +98,15 @@ await import("../../docs/wenxian.js");
9098
9199const flush = ( ) => new Promise ( ( resolve ) => setImmediate ( resolve ) ) ;
92100
101+ test ( "blank lookup prompts for an identifier" , ( ) => {
102+ elements . identifier . value = " " ;
103+ elements . identifier . focused = false ;
104+ elements [ "lookup-form" ] . requestSubmit ( ) ;
105+
106+ assert . match ( elements . message . textContent , / E n t e r a D O I / ) ;
107+ assert . equal ( elements . identifier . focused , true ) ;
108+ } ) ;
109+
93110test ( "successful lookup shows progress and BibTeX" , async ( ) => {
94111 mode = "success" ;
95112 elements . identifier . value = " 10.1063/5.0155600 " ;
@@ -132,13 +149,33 @@ test("worker errors are surfaced instead of hanging", async () => {
132149 assert . equal ( elements . submit . disabled , false ) ;
133150} ) ;
134151
152+ test ( "unexpected worker failures are surfaced" , async ( ) => {
153+ mode = "throw" ;
154+ elements . identifier . value = "2304.09409" ;
155+ elements [ "lookup-form" ] . requestSubmit ( ) ;
156+ await flush ( ) ;
157+
158+ assert . equal ( elements . message . textContent , "worker post failed" ) ;
159+ assert . equal ( elements . submit . disabled , false ) ;
160+ } ) ;
161+
162+ test ( "clipboard failures update the copy button" , async ( ) => {
163+ clipboardFails = true ;
164+ elements . copy_button . textContent = "Copy BibTeX" ;
165+ await globalThis . copy_bibtex ( ) ;
166+ clipboardFails = false ;
167+
168+ assert . equal ( elements . copy_button . textContent , "Copy failed" ) ;
169+ } ) ;
170+
135171test ( "examples and copy action remain functional" , async ( ) => {
136172 mode = "success" ;
137173 globalThis . run_example ( "2304.09409" ) ;
138174 await flush ( ) ;
139175 assert . equal ( elements . identifier . value , "2304.09409" ) ;
140176
141177 elements . bibtex . textContent = "@Article{copied}" ;
178+ elements . copy_button . textContent = "Copy BibTeX" ;
142179 await globalThis . copy_bibtex ( ) ;
143180 assert . equal ( copied . at ( - 1 ) , "@Article{copied}" ) ;
144181 assert . equal ( elements . copy_button . textContent , "Copied!" ) ;
0 commit comments