Skip to content

Commit 7416bce

Browse files
committed
Fix subscription for execution results
1 parent 88ec3e1 commit 7416bce

8 files changed

Lines changed: 102 additions & 9 deletions

File tree

app/graphql/subscription_triggers.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ def self.execution_result(execution_result)
55
SagittariusSchema.subscriptions.trigger(
66
:namespaces_projects_flows_execution_result,
77
{ execution_identifier: execution_result.execution_identifier },
8-
execution_result
8+
execution_result,
9+
context: { visibility_profile: :execution }
910
)
1011
end
1112
end

app/graphql/subscriptions/base_subscription.rb

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,19 @@ class BaseSubscription < GraphQL::Schema::Subscription
66
field_class Types::BaseField
77
object_class Types::BaseObject
88

9-
def current_authentication
10-
context[:current_authentication]
9+
def self.inherited(subclass)
10+
super
11+
subclass.graphql_name subclass.name.delete_prefix('Subscriptions::').gsub('::', '')
1112
end
1213

1314
def self.generate_payload_type
1415
result = super
1516
result.graphql_name("#{graphql_name}SubscriptionPayload")
1617
result
1718
end
19+
20+
def current_authentication
21+
context[:current_authentication]
22+
end
1823
end
1924
end

app/graphql/subscriptions/namespaces/projects/flows/execution_result_subscription.rb renamed to app/graphql/subscriptions/namespaces/projects/flows/execution_result.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ module Subscriptions
44
module Namespaces
55
module Projects
66
module Flows
7-
class ExecutionResultSubscription < BaseSubscription
7+
class ExecutionResult < BaseSubscription
88
description 'Subscription to asynchronously receive an execution result'
99

1010
argument :execution_identifier,
@@ -18,7 +18,7 @@ class ExecutionResultSubscription < BaseSubscription
1818
description: 'The execution result of the relevant execution'
1919

2020
def subscribe(execution_identifier:)
21-
result = ExecutionResult.find_by(execution_identifier: execution_identifier)
21+
result = ::ExecutionResult.find_by(execution_identifier: execution_identifier)
2222

2323
if result.present?
2424
unsubscribe({ execution_result: result })

app/graphql/types/subscription_type.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ class SubscriptionType < Types::BaseObject
66

77
include Sagittarius::Graphql::MountSubscription
88

9-
mount_subscription Subscriptions::Namespaces::Projects::Flows::ExecutionResultSubscription
9+
mount_subscription Subscriptions::Namespaces::Projects::Flows::ExecutionResult
1010
mount_subscription Subscriptions::Echo
1111
end
1212
end

app/grpc/execution_handler.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ def test(requests, call)
2121
end
2222

2323
Thread.new do
24-
ActiveRecord::Base.connection_pool.with_connection do
25-
requests.each do |request|
24+
requests.each do |request|
25+
ApplicationRecord.connection_pool.with_connection do
2626
case request.data
2727
when :logon
2828
logger.info(message: 'Execution runtime sent logon', runtime_id: current_runtime_id)

docs/graphql/subscription/executionresultsubscription.md renamed to docs/graphql/subscription/namespacesprojectsflowsexecutionresult.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
title: executionResultSubscription
2+
title: namespacesProjectsFlowsExecutionResult
33
---
44

55
Subscription to asynchronously receive an execution result
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
# frozen_string_literal: true
2+
3+
require 'rails_helper'
4+
5+
RSpec.describe 'namespacesProjectsFlowsExecutionResult Subscription', type: :channel do
6+
include AuthenticationHelpers
7+
include ActionCable::Channel::TestCase::Behavior
8+
9+
include_context 'with graphql subscription support'
10+
11+
tests GraphqlChannel
12+
13+
let(:user) { create(:user) }
14+
let(:token) { "Session #{authorization_token(user)}" }
15+
let(:flow) { create(:flow) }
16+
let(:execution_identifier) { 'existing-execution' }
17+
18+
let(:subscription_query) do
19+
<<~GQL
20+
subscription($executionIdentifier: String!) {
21+
namespacesProjectsFlowsExecutionResult(executionIdentifier: $executionIdentifier) {
22+
executionResult { success }
23+
}
24+
}
25+
GQL
26+
end
27+
28+
before do
29+
create(:namespace_member, namespace: flow.project.namespace, user: user)
30+
stub_allowed_ability(NamespaceProjectPolicy, :read_namespace_project, user: user, subject: flow.project)
31+
32+
subscribe(token: token)
33+
end
34+
35+
context 'when the execution result already exists' do
36+
before do
37+
create(:execution_result, flow: flow, execution_identifier: execution_identifier, success: { 'done' => true })
38+
end
39+
40+
it 'immediately delivers the result in the initial subscription response' do
41+
perform :execute, query: subscription_query, variables: { executionIdentifier: execution_identifier }
42+
43+
result = transmissions.last
44+
expect(result.dig('result', 'data', 'namespacesProjectsFlowsExecutionResult', 'executionResult', 'success'))
45+
.to eq({ 'done' => true })
46+
end
47+
end
48+
end

spec/services/namespaces/projects/flows/persist_execution_result_service_spec.rb

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,4 +172,43 @@
172172
expect(service_response.payload[:error_code]).to eq(:invalid_execution_result)
173173
end
174174
end
175+
176+
context 'with subscription integration', type: :channel do
177+
include AuthenticationHelpers
178+
include ActionCable::Channel::TestCase::Behavior
179+
180+
include_context 'with graphql subscription support'
181+
182+
tests GraphqlChannel
183+
184+
let(:user) { create(:user) }
185+
let(:token) { "Session #{authorization_token(user)}" }
186+
187+
before do
188+
allow(SubscriptionTriggers).to receive(:execution_result).and_call_original
189+
190+
create(:namespace_member, namespace: flow.project.namespace, user: user)
191+
stub_allowed_ability(NamespaceProjectPolicy, :read_namespace_project, user: user, subject: flow.project)
192+
193+
subscribe(token: token)
194+
195+
perform :execute,
196+
query: <<~GQL,
197+
subscription($executionIdentifier: String!) {
198+
namespacesProjectsFlowsExecutionResult(executionIdentifier: $executionIdentifier) {
199+
executionResult { success }
200+
}
201+
}
202+
GQL
203+
variables: { executionIdentifier: 'execution-identifier' }
204+
end
205+
206+
it 'delivers the execution result to subscribers without visibility profile error' do
207+
service_response
208+
209+
result = transmissions.last
210+
expect(result.dig('result', 'data', 'namespacesProjectsFlowsExecutionResult', 'executionResult', 'success'))
211+
.to eq({ 'result' => true })
212+
end
213+
end
175214
end

0 commit comments

Comments
 (0)