@@ -301,6 +301,87 @@ func TestUserExport(t *testing.T) {
301301 })
302302}
303303
304+ func TestUserEmailChange (t * testing.T ) {
305+ t .Run ("requests email change" , func (t * testing.T ) {
306+ mock := NewMockClient ()
307+ mock .PostResponse = & client.APIResponse {StatusCode : 204 , Data : nil }
308+
309+ result := SetTestModeWithSDK (mock )
310+ SetTestConfig ("token" , "account" , "https://api.example.com" )
311+ defer resetTest ()
312+
313+ userEmailChangeRequestEmail = "new@example.com"
314+ err := userEmailChangeRequestCmd .RunE (userEmailChangeRequestCmd , []string {"user-1" })
315+ userEmailChangeRequestEmail = ""
316+
317+ assertExitCode (t , err , 0 )
318+ if mock .PostCalls [0 ].Path != "/users/user-1/email_addresses.json" {
319+ t .Errorf ("expected path '/users/user-1/email_addresses.json', got '%s'" , mock .PostCalls [0 ].Path )
320+ }
321+ body := mock .PostCalls [0 ].Body .(map [string ]any )
322+ if body ["email_address" ] != "new@example.com" {
323+ t .Errorf ("expected email_address 'new@example.com', got '%v'" , body ["email_address" ])
324+ }
325+ data , ok := result .Response .Data .(map [string ]any )
326+ if ! ok || data ["requested" ] != true {
327+ t .Fatalf ("expected explicit requested=true payload, got %#v" , result .Response .Data )
328+ }
329+ })
330+
331+ t .Run ("confirms email change" , func (t * testing.T ) {
332+ mock := NewMockClient ()
333+ mock .PostResponse = & client.APIResponse {StatusCode : 204 , Data : nil }
334+
335+ result := SetTestModeWithSDK (mock )
336+ SetTestConfig ("token" , "account" , "https://api.example.com" )
337+ defer resetTest ()
338+
339+ err := userEmailChangeConfirmCmd .RunE (userEmailChangeConfirmCmd , []string {"user-1" , "token-123" })
340+
341+ assertExitCode (t , err , 0 )
342+ if mock .PostCalls [0 ].Path != "/users/user-1/email_addresses/token-123/confirmation.json" {
343+ t .Errorf ("expected confirmation path, got '%s'" , mock .PostCalls [0 ].Path )
344+ }
345+ data , ok := result .Response .Data .(map [string ]any )
346+ if ! ok || data ["confirmed" ] != true {
347+ t .Fatalf ("expected explicit confirmed=true payload, got %#v" , result .Response .Data )
348+ }
349+ })
350+
351+ t .Run ("requires email flag" , func (t * testing.T ) {
352+ mock := NewMockClient ()
353+ SetTestModeWithSDK (mock )
354+ SetTestConfig ("token" , "account" , "https://api.example.com" )
355+ defer resetTest ()
356+
357+ userEmailChangeRequestEmail = ""
358+ err := userEmailChangeRequestCmd .RunE (userEmailChangeRequestCmd , []string {"user-1" })
359+ assertExitCode (t , err , errors .ExitInvalidArgs )
360+ })
361+
362+ t .Run ("request requires authentication" , func (t * testing.T ) {
363+ mock := NewMockClient ()
364+ SetTestModeWithSDK (mock )
365+ SetTestConfig ("" , "account" , "https://api.example.com" )
366+ defer resetTest ()
367+
368+ userEmailChangeRequestEmail = "new@example.com"
369+ err := userEmailChangeRequestCmd .RunE (userEmailChangeRequestCmd , []string {"user-1" })
370+ userEmailChangeRequestEmail = ""
371+ assertExitCode (t , err , errors .ExitAuthFailure )
372+ })
373+
374+ t .Run ("confirm requires authentication" , func (t * testing.T ) {
375+ mock := NewMockClient ()
376+ SetTestModeWithSDK (mock )
377+ SetTestConfig ("" , "account" , "https://api.example.com" )
378+ defer resetTest ()
379+
380+ err := userEmailChangeConfirmCmd .RunE (userEmailChangeConfirmCmd , []string {"user-1" , "token-123" })
381+ assertExitCode (t , err , errors .ExitAuthFailure )
382+ })
383+ }
384+
304385func TestUserPushSubscriptionCreate (t * testing.T ) {
305386 t .Run ("creates push subscription" , func (t * testing.T ) {
306387 mock := NewMockClient ()
0 commit comments