|
6 | 6 | createMockExtensionContext, |
7 | 7 | createMockRemoteSSHExtension, |
8 | 8 | createMockWorkspaceProvider, |
9 | | -createMockRemote, |
10 | 9 | createMockStorage, |
11 | 10 | createMockCommands, |
12 | 11 | createMockOutputChannel, |
@@ -123,21 +122,6 @@ const setupVSCodeMocks = async () => { |
123 | 122 | returnvscode; |
124 | 123 | }; |
125 | 124 |
|
126 | | -constcreateAuthTestContext=()=>{ |
127 | | -constmockStorage=createMockStorage({writeToCoderOutputChannel:vi.fn()}); |
128 | | -constmockMyWorkspacesProvider=createMockWorkspaceProvider({ |
129 | | -fetchAndRefresh:vi.fn(), |
130 | | -}); |
131 | | -constmockAllWorkspacesProvider=createMockWorkspaceProvider({ |
132 | | -fetchAndRefresh:vi.fn(), |
133 | | -}); |
134 | | -return{ |
135 | | -mockStorage, |
136 | | -mockMyWorkspacesProvider, |
137 | | -mockAllWorkspacesProvider, |
138 | | -}; |
139 | | -}; |
140 | | - |
141 | 125 | describe("extension",()=>{ |
142 | 126 | describe("setupRemoteSSHExtension",()=>{ |
143 | 127 | it.each([ |
@@ -517,211 +501,4 @@ describe("extension", () => { |
517 | 501 | expect(providers.all.fetchAndRefresh).toHaveBeenCalled(); |
518 | 502 | }); |
519 | 503 | }); |
520 | | - |
521 | | -describe("handleRemoteEnvironment",()=>{ |
522 | | -it("should handle remote environment when remoteSSHExtension and remoteAuthority exist",async()=>{ |
523 | | -constvscode=awaitimport("vscode"); |
524 | | -const{ Remote}=awaitimport("./remote"); |
525 | | - |
526 | | -constmockVscodeProposed={ |
527 | | -env:{remoteAuthority:"test-remote-authority"}, |
528 | | -window:{ |
529 | | -showErrorMessage:vi.fn(), |
530 | | -}, |
531 | | -}asunknownastypeofvscode; |
532 | | - |
533 | | -constmockRemoteSSHExtension=createMockRemoteSSHExtension({ |
534 | | -extensionPath:"/path/to/extension", |
535 | | -}); |
536 | | - |
537 | | -constmockRestClient={ |
538 | | -setHost:vi.fn(), |
539 | | -setSessionToken:vi.fn(), |
540 | | -}; |
541 | | - |
542 | | -constmockStorage={ |
543 | | -writeToCoderOutputChannel:vi.fn(), |
544 | | -}; |
545 | | - |
546 | | -constmockCommands={}; |
547 | | - |
548 | | -constmockContext=createMockExtensionContext({ |
549 | | -extensionMode:1,// Normal mode |
550 | | -}); |
551 | | - |
552 | | -constmockRemote=createMockRemote({ |
553 | | -setup:vi.fn().mockResolvedValue({ |
554 | | -url:"https://test.coder.com", |
555 | | -token:"test-token-123", |
556 | | -}), |
557 | | -closeRemote:vi.fn(), |
558 | | -}); |
559 | | - |
560 | | -vi.mocked(Remote).mockImplementation(()=>mockRemoteasnever); |
561 | | - |
562 | | -constresult=awaitextension.handleRemoteEnvironment( |
563 | | -mockVscodeProposed, |
564 | | -mockRemoteSSHExtension, |
565 | | -mockRestClientasnever, |
566 | | -mockStorageasnever, |
567 | | -mockCommandsasnever, |
568 | | -mockContext, |
569 | | -); |
570 | | - |
571 | | -expect(Remote).toHaveBeenCalledWith( |
572 | | -mockVscodeProposed, |
573 | | -mockStorage, |
574 | | -mockCommands, |
575 | | -mockContext.extensionMode, |
576 | | -); |
577 | | -expect(mockRemote.setup).toHaveBeenCalledWith("test-remote-authority"); |
578 | | -expect(mockRestClient.setHost).toHaveBeenCalledWith( |
579 | | -"https://test.coder.com", |
580 | | -); |
581 | | -expect(mockRestClient.setSessionToken).toHaveBeenCalledWith( |
582 | | -"test-token-123", |
583 | | -); |
584 | | -expect(result).toBe(true);// Success |
585 | | -}); |
586 | | -}); |
587 | | - |
588 | | -describe("checkAuthentication",()=>{ |
589 | | -beforeEach(()=>{ |
590 | | -vi.clearAllMocks(); |
591 | | -}); |
592 | | - |
593 | | -it.each([ |
594 | | -[ |
595 | | -"valid member authentication", |
596 | | -{ |
597 | | -baseURL:"https://test.coder.com", |
598 | | -user:{username:"test-user",roles:[{name:"member"}]}, |
599 | | -}, |
600 | | -{authenticated:true,isOwner:false,workspacesRefreshed:true}, |
601 | | -], |
602 | | -])("%s",async(_,config,expected)=>{ |
603 | | -const{ |
604 | | -mockStorage, |
605 | | -mockMyWorkspacesProvider, |
606 | | -mockAllWorkspacesProvider, |
607 | | -}=createAuthTestContext(); |
608 | | - |
609 | | -constmockRestClient={ |
610 | | -getAxiosInstance:vi |
611 | | -.fn() |
612 | | -.mockReturnValue({defaults:{baseURL:config.baseURL}}), |
613 | | -getAuthenticatedUser:config.user |
614 | | -?vi.fn().mockResolvedValue(config.user) |
615 | | -:vi.fn(), |
616 | | -}; |
617 | | - |
618 | | -awaitextension.checkAuthentication( |
619 | | -mockRestClientasnever, |
620 | | -mockStorageasnever, |
621 | | -mockMyWorkspacesProviderasnever, |
622 | | -mockAllWorkspacesProviderasnever, |
623 | | -); |
624 | | - |
625 | | -if(expected.authenticated){ |
626 | | -expect(vscodeActual.commands.executeCommand).toHaveBeenCalledWith( |
627 | | -"setContext", |
628 | | -"coder.authenticated", |
629 | | -true, |
630 | | -); |
631 | | -if(expected.isOwner){ |
632 | | -expect(vscodeActual.commands.executeCommand).toHaveBeenCalledWith( |
633 | | -"setContext", |
634 | | -"coder.isOwner", |
635 | | -true, |
636 | | -); |
637 | | -} |
638 | | -}elseif("skipUserCheck"inexpected&&expected.skipUserCheck){ |
639 | | -expect(mockRestClient.getAuthenticatedUser).not.toHaveBeenCalled(); |
640 | | -} |
641 | | - |
642 | | -expect(vscodeActual.commands.executeCommand).toHaveBeenCalledWith( |
643 | | -"setContext", |
644 | | -"coder.loaded", |
645 | | -true, |
646 | | -); |
647 | | - |
648 | | -if(expected.workspacesRefreshed){ |
649 | | -expect(mockMyWorkspacesProvider.fetchAndRefresh).toHaveBeenCalled(); |
650 | | -expect(mockAllWorkspacesProvider.fetchAndRefresh).toHaveBeenCalled(); |
651 | | -}else{ |
652 | | -expect(mockMyWorkspacesProvider.fetchAndRefresh).not.toHaveBeenCalled(); |
653 | | -expect( |
654 | | -mockAllWorkspacesProvider.fetchAndRefresh, |
655 | | -).not.toHaveBeenCalled(); |
656 | | -} |
657 | | -}); |
658 | | -}); |
659 | | - |
660 | | -describe("handleAutologin",()=>{ |
661 | | -beforeEach(()=>{ |
662 | | -vi.clearAllMocks(); |
663 | | -}); |
664 | | - |
665 | | -it.each([ |
666 | | -[ |
667 | | -"autologin enabled with defaultUrl", |
668 | | -{ |
669 | | -autologin:true, |
670 | | -defaultUrl:"https://auto.coder.com", |
671 | | -baseURL:"", |
672 | | -envUrl:undefined, |
673 | | -}, |
674 | | -{shouldLogin:true,expectedUrl:"https://auto.coder.com"}, |
675 | | -], |
676 | | -])("should handle %s",async(_,config,expected)=>{ |
677 | | -constmockRestClient={ |
678 | | -getAxiosInstance:vi.fn().mockReturnValue({ |
679 | | -defaults:{baseURL:config.baseURL}, |
680 | | -}), |
681 | | -}; |
682 | | - |
683 | | -constmockConfig=createMockConfiguration({ |
684 | | -"coder.autologin":config.autologin, |
685 | | -"coder.defaultUrl":config.defaultUrl, |
686 | | -}); |
687 | | -vi.mocked(vscodeActual.workspace.getConfiguration).mockReturnValue( |
688 | | -mockConfig, |
689 | | -); |
690 | | - |
691 | | -// Handle environment variable |
692 | | -constoriginalEnv=process.env.CODER_URL; |
693 | | -if(config.envUrl!==undefined){ |
694 | | -process.env.CODER_URL=config.envUrl; |
695 | | -}else{ |
696 | | -deleteprocess.env.CODER_URL; |
697 | | -} |
698 | | - |
699 | | -awaitextension.handleAutologin(mockRestClientasnever); |
700 | | - |
701 | | -if(expected.shouldLogin){ |
702 | | -expect(vscodeActual.commands.executeCommand).toHaveBeenCalledWith( |
703 | | -"coder.login", |
704 | | -"expectedUrl"inexpected ?expected.expectedUrl :undefined, |
705 | | -undefined, |
706 | | -undefined, |
707 | | -"true", |
708 | | -); |
709 | | -}else{ |
710 | | -expect(vscodeActual.commands.executeCommand).not.toHaveBeenCalledWith( |
711 | | -"coder.login", |
712 | | -expect.anything(), |
713 | | -expect.anything(), |
714 | | -expect.anything(), |
715 | | -expect.anything(), |
716 | | -); |
717 | | -} |
718 | | - |
719 | | -// Restore environment |
720 | | -if(originalEnv!==undefined){ |
721 | | -process.env.CODER_URL=originalEnv; |
722 | | -}else{ |
723 | | -deleteprocess.env.CODER_URL; |
724 | | -} |
725 | | -}); |
726 | | -}); |
727 | 504 | }); |