@@ -207,6 +207,48 @@ describe('SSO admission with a hosted SCIM directory in PostgreSQL', () => {
207207 expect ( await membership ( ) ) . toEqual ( [ { id : memberId , role : 'admin' } ] )
208208 } )
209209
210+ async function emailVerified ( ) {
211+ const { db, schema, eq } = runtime
212+ const [ row ] = await db
213+ . select ( { emailVerified : schema . user . emailVerified } )
214+ . from ( schema . user )
215+ . where ( eq ( schema . user . id , userId ) )
216+ return row ?. emailVerified
217+ }
218+
219+ it ( 'verifies a directory-provisioned member who signs in through the verified-domain provider' , async ( ) => {
220+ const { db, schema, eq } = runtime
221+ const memberId = generateId ( )
222+ await db . insert ( schema . member ) . values ( { id : memberId , userId, organizationId, role : 'member' } )
223+ await db . update ( schema . user ) . set ( { emailVerified : false } ) . where ( eq ( schema . user . id , userId ) )
224+
225+ await expect ( admit ( ) ) . resolves . toEqual ( { kind : 'already-member' , organizationId, memberId } )
226+ expect ( await emailVerified ( ) ) . toBe ( true )
227+ } )
228+
229+ it ( 'leaves an address outside the provider domain unverified' , async ( ) => {
230+ const { db, schema, eq } = runtime
231+ await db
232+ . update ( schema . user )
233+ . set ( { emailVerified : false , email : `${ userId } @elsewhere.test` } )
234+ . where ( eq ( schema . user . id , userId ) )
235+
236+ await expect ( admit ( ) ) . resolves . toEqual ( { kind : 'denied' , reason : 'domain-mismatch' } )
237+ expect ( await emailVerified ( ) ) . toBe ( false )
238+ } )
239+
240+ it ( 'leaves the address unverified when the provider domain is not proven' , async ( ) => {
241+ const { db, schema, eq } = runtime
242+ await db . update ( schema . user ) . set ( { emailVerified : false } ) . where ( eq ( schema . user . id , userId ) )
243+ await db
244+ . update ( schema . ssoProvider )
245+ . set ( { domainVerified : false } )
246+ . where ( eq ( schema . ssoProvider . providerId , providerId ) )
247+
248+ await expect ( admit ( ) ) . resolves . toEqual ( { kind : 'denied' , reason : 'provider-not-trusted' } )
249+ expect ( await emailVerified ( ) ) . toBe ( false )
250+ } )
251+
210252 it ( 'resumes normal JIT admission when the directory permits automatic membership' , async ( ) => {
211253 const { db, schema, eq } = runtime
212254 await db
0 commit comments