@@ -692,6 +692,52 @@ func TestWorkspaceStorageUpdateRejectsDifferentTemplateVersionID(t *testing.T) {
692692 }
693693}
694694
695+ func TestWorkspaceStorageUpdateRejectsMissingResourceVersion (t * testing.T ) {
696+ t .Parallel ()
697+
698+ server , state := newMockCoderServer (t )
699+ defer server .Close ()
700+
701+ workspaceStorage := NewWorkspaceStorage (newTestClientProvider (t , server .URL ))
702+ ctx := namespacedContext ("control-plane" )
703+
704+ currentObj , err := workspaceStorage .Get (ctx , "acme.alice.dev-workspace" , nil )
705+ if err != nil {
706+ t .Fatalf ("expected workspace get to succeed: %v" , err )
707+ }
708+
709+ currentWorkspace , ok := currentObj .(* aggregationv1alpha1.CoderWorkspace )
710+ if ! ok {
711+ t .Fatalf ("expected *CoderWorkspace from get, got %T" , currentObj )
712+ }
713+ if currentWorkspace .ResourceVersion == "" {
714+ t .Fatal ("expected current workspace resourceVersion to be populated" )
715+ }
716+
717+ desiredWorkspace := currentWorkspace .DeepCopy ()
718+ desiredWorkspace .Spec .Running = ! currentWorkspace .Spec .Running
719+ desiredWorkspace .ResourceVersion = ""
720+
721+ _ , _ , err = workspaceStorage .Update (
722+ ctx ,
723+ desiredWorkspace .Name ,
724+ testUpdatedObjectInfo {obj : desiredWorkspace },
725+ nil ,
726+ rest .ValidateAllObjectUpdateFunc ,
727+ false ,
728+ nil ,
729+ )
730+ if ! apierrors .IsBadRequest (err ) {
731+ t .Fatalf ("expected BadRequest for missing resourceVersion, got %v" , err )
732+ }
733+ if err == nil || ! strings .Contains (err .Error (), "metadata.resourceVersion is required for update" ) {
734+ t .Fatalf ("expected missing resourceVersion error message, got %v" , err )
735+ }
736+ if transitions := state .buildTransitionsSnapshot (); len (transitions ) != 0 {
737+ t .Fatalf ("expected no workspace build transitions when resourceVersion is missing, got %v" , transitions )
738+ }
739+ }
740+
695741func TestWorkspaceStorageUpdateRejectsStaleResourceVersion (t * testing.T ) {
696742 t .Parallel ()
697743
0 commit comments