From ecbd3292af7e1b95e886c4cdb0fb530e60f645f9 Mon Sep 17 00:00:00 2001 From: rowkav09 Date: Fri, 2 Oct 2026 02:29:51 +0100 Subject: [PATCH] Explain a denied GitHub device sign-in Closes #1037 --- src/settings-onboarding-page.js | 2 +- test/settings-hosted-denied-feedback.test.js | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 test/settings-hosted-denied-feedback.test.js diff --git a/src/settings-onboarding-page.js b/src/settings-onboarding-page.js index aac8b847..8809f628 100644 --- a/src/settings-onboarding-page.js +++ b/src/settings-onboarding-page.js @@ -82,7 +82,7 @@ async function pollHosted(generation){ } catch(e){ if(generation!==hostedGeneration)return; hostedFlow=false; - say('hosted-service-result','GitHub sign-in failed: '+e.message); + say('hosted-service-result','GitHub sign-in failed: '+(e.message==='denied'?'Sign-in was not approved. Click Sign in with GitHub to try again.':e.message)); } } load(); diff --git a/test/settings-hosted-denied-feedback.test.js b/test/settings-hosted-denied-feedback.test.js new file mode 100644 index 00000000..0e1b9ebc --- /dev/null +++ b/test/settings-hosted-denied-feedback.test.js @@ -0,0 +1,13 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import {runInNewContext} from 'node:vm'; +import {SERVICE_SCRIPT} from '../src/settings-onboarding-page.js'; +test('GitHub device-flow denial explains that the user can start again',async()=>{ + const nodes=new Map();const get=id=>{if(!nodes.has(id))nodes.set(id,{value:'https://cards.example',hidden:true,addEventListener(k,fn){this[k]=fn},replaceChildren(){}});return nodes.get(id)}; + const say=(id,text)=>get(id).textContent=text; + const start=SERVICE_SCRIPT.indexOf('async function pollHosted(');const end=SERVICE_SCRIPT.lastIndexOf('load();'); + const context={$:get,say,hostedFlow:true,hostedGeneration:1,api:async()=>({status:'denied'}),load(){throw Error('should not load after denial')}}; + runInNewContext(SERVICE_SCRIPT.slice(start,end),context);await context.pollHosted(1); + assert.equal(get('hosted-service-result').textContent,'GitHub sign-in failed: Sign-in was not approved. Click Sign in with GitHub to try again.'); + assert.equal(context.hostedFlow,false); +});