Fix workspace factories for workspace token in different scenarios
The following discussion from !205021 should be addressed:
- [ ] @cwoolley-gitlab started a [discussion](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/205021#note_2758883126): (+4 comments)
> **issue:** We should always use `let_it_be` when possible (https://docs.gitlab.com/development/testing_guide/best_practices/#lets-talk-about-let), unless there's a reason not to (usually due to complex `before` setup which can interact with `let_it_be`, which is implmented with `before` under the covers).
>
> But I didn't see why it should be necessary here.
>
> I dug into it for a while, and realized there was an existing bug in this test, because the fixture was getting created with workspace_variable records already associated.
>
> So, the reason your test was failing was because you were finding the wrong variable record with a nil value (from the original variable creation).
>
> Below is a patch to fix that.
>
> **issue** However, this uncovered another bug in this design. Even with the factory, the default value for the `gl_agentw_token` variable should never be `nil`, it should be empty string.
>
> This is because the factory calls `ee/lib/remote_development/workspace_operations/create/workspace_variables_builder.rb` directly, but you have added the empty-string-defaulting logic to `ee/lib/remote_development/workspace_operations/create/workspace_variables_creator.rb` instead of `ee/lib/remote_development/workspace_operations/create/workspace_variables_builder.rb`
>
> So, I think the logic for the defaulting needs to be moved to `ee/lib/remote_development/workspace_operations/create/workspace_variables_builder.rb` instead.
>
> So, the patch below may only be partially relevant - we should still fix the fixture, but the actual example and test should probably move to the spec for `ee/lib/remote_development/workspace_operations/create/workspace_variables_builder.rb` instead.
>
> <details>
> <summary>patch</summary>
>
>
> ```diff
> Index: ee/spec/lib/remote_development/workspace_operations/create/workspace_variables_creator_spec.rb
> IDEA additional info:
> Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
> <+>UTF-8
> ===================================================================
> diff --git a/ee/spec/lib/remote_development/workspace_operations/create/workspace_variables_creator_spec.rb b/ee/spec/lib/remote_development/workspace_operations/create/workspace_variables_creator_spec.rb
> --- a/ee/spec/lib/remote_development/workspace_operations/create/workspace_variables_creator_spec.rb (revision b3982bd905d34aeb4dd6806a8b27ffd555c318c4)
> +++ b/ee/spec/lib/remote_development/workspace_operations/create/workspace_variables_creator_spec.rb (date 1758156868863)
> @@ -12,8 +12,11 @@
> let_it_be(:user) { create(:user) }
> let_it_be(:personal_access_token) { create(:personal_access_token, user: user) }
> # The desired state of the workspace is set to running so that a workspace token gets associated to it.
> - let(:workspace) do
> - create(:workspace, user: user, personal_access_token: personal_access_token, desired_state: states_module::RUNNING)
> + let_it_be(:workspace, refind: true) do
> + create(
> + :workspace, :without_workspace_variables,
> + user: user, personal_access_token: personal_access_token, desired_state: states_module::RUNNING
> + )
> end
>
> let(:vscode_extension_marketplace) do
> @@ -53,6 +56,12 @@
> described_class.create(context) # rubocop:disable Rails/SaveBang -- this is not an ActiveRecord method
> end
>
> + it "has fixture sanity check" do
> + # We must ensure the workspace fixture, which simulates a workspace in the ROP create chain in the process of being
> + # created, does not contain any pre-existing associated workspace_variable records
> + expect(workspace.workspace_variables.count).to eq(0)
> + end
> +
> context "when workspace variables create is successful" do
> let(:valid_variable_type) { RemoteDevelopment::Enums::WorkspaceVariable::ENVIRONMENT_TYPE }
> let(:variable_type) { valid_variable_type }
> @@ -61,8 +70,8 @@
> it "creates the workspace variable records and returns ok result containing original context" do
> expect { result }.to change { workspace.workspace_variables.count }.by(expected_number_of_records_saved)
>
> - expect(RemoteDevelopment::WorkspaceVariable.find_by_key("key1").value).to eq("value 1")
> - expect(RemoteDevelopment::WorkspaceVariable.find_by_key("key2").value).to eq("value 2")
> + expect(workspace.workspace_variables.find_by_key("key1").value).to eq("value 1")
> + expect(workspace.workspace_variables.find_by_key("key2").value).to eq("value 2")
>
> expect(result).to be_ok_result(context)
> end
> @@ -84,7 +93,7 @@
> it "creates the workspace variable records and returns ok result containing original context" do
> expect { result }.to change { workspace.workspace_variables.count }.by(expected_number_of_records_saved)
>
> - expect(RemoteDevelopment::WorkspaceVariable.find_by_key(agentw_token_file_name).value).not_to be_empty
> + expect(workspace.workspace_variables.find_by_key(agentw_token_file_name).value).to match(/glwt-.*/)
>
> expect(result).to be_ok_result(context)
> end
> ```
>
>
> </details>
issue