|
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 | });
|