@@ -86,7 +86,10 @@ async function person(member: Member, memberId: string) {
8686 const result = await api ( member , `/${ memberId } ` , { } )
8787 assert ( isRecordLike ( result . person ) , 'Expected a person' )
8888 return result as {
89- person : Record < string , unknown > & { manager : { memberId : string } | null }
89+ person : Record < string , unknown > & {
90+ manager : { memberId : string } | null
91+ managerMemberId : string | null
92+ }
9093 chain : { memberId : string } [ ]
9194 reports : { memberId : string } [ ]
9295 }
@@ -297,6 +300,62 @@ async function run() {
297300 assert . equal ( row ?. manager_member_id , owner . memberId )
298301 } )
299302
303+ await check (
304+ "an edit keeps a suspended manager it doesn't change, and refuses one as a new manager" ,
305+ async ( ) => {
306+ const margaret = await seedMember ( orgId , 'member' , 'Margaret' )
307+ const edit = ( memberId : string , body : Record < string , unknown > , expected = 200 ) =>
308+ api ( owner , `/${ memberId } ` , { method : 'PUT' , body, expected } )
309+ await edit ( ada . memberId , {
310+ title : 'Engineer' ,
311+ department : 'Platform' ,
312+ location : 'Berlin, Germany' ,
313+ startDate : '2021-03-04' ,
314+ managerMemberId : margaret . memberId ,
315+ } )
316+ await sql `update "user" set suspended_at = now() where id = ${ margaret . userId } `
317+
318+ const { person : shown } = await person ( owner , ada . memberId )
319+ assert . equal ( shown . manager , null , 'A suspended manager is not shown' )
320+ assert . equal ( shown . managerMemberId , margaret . memberId , 'The stored link is still reported' )
321+ const saved = await edit ( ada . memberId , {
322+ title : 'Staff Engineer' ,
323+ department : shown . department ,
324+ location : shown . location ,
325+ startDate : shown . startDate ,
326+ managerMemberId : shown . managerMemberId ,
327+ } )
328+ assert ( isRecordLike ( saved . person ) , 'Expected a person' )
329+ assert . equal ( saved . person . managerMemberId , margaret . memberId )
330+ const row = await profileRow ( ada . memberId )
331+ assert . equal ( row ?. title , 'Staff Engineer' )
332+ assert . equal ( row ?. manager_member_id , margaret . memberId )
333+
334+ const refused = await edit (
335+ linus . memberId ,
336+ {
337+ title : 'Principal Engineer' ,
338+ department : null ,
339+ location : null ,
340+ startDate : '2019-07-01' ,
341+ managerMemberId : margaret . memberId ,
342+ } ,
343+ 400
344+ )
345+ assert . equal ( refused . error , 'The manager must be a member of this organization' )
346+ assert . equal ( ( await profileRow ( linus . memberId ) ) ?. manager_member_id , owner . memberId )
347+
348+ await edit ( ada . memberId , {
349+ title : 'Staff Engineer' ,
350+ department : shown . department ,
351+ location : shown . location ,
352+ startDate : shown . startDate ,
353+ managerMemberId : owner . memberId ,
354+ } )
355+ assert . equal ( ( await profileRow ( ada . memberId ) ) ?. manager_member_id , owner . memberId )
356+ }
357+ )
358+
300359 await check (
301360 'leaving the organization removes the profile and clears reporting lines' ,
302361 async ( ) => {
@@ -308,7 +367,7 @@ async function run() {
308367 )
309368
310369 await check ( 'imports and edits are audited' , async ( ) => {
311- const expected = { 'org_people.imported' : 3 , 'org_member.profile_updated' : 1 }
370+ const expected = { 'org_people.imported' : 3 , 'org_member.profile_updated' : 4 }
312371 let counts : Record < string , number > = { }
313372 for ( let attempt = 0 ; attempt < 20 ; attempt ++ ) {
314373 const rows = await sql <
0 commit comments