Skip to content

Commit 713e8b9

Browse files
committed
Fix accidental nulling of pull request in Task.Service
1 parent 190f295 commit 713e8b9

File tree

4 files changed

+55
-15
lines changed

4 files changed

+55
-15
lines changed

lib/code_corps/github/sync/issue/github_issue/github_issue.ex

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,21 @@ defmodule CodeCorps.GitHub.Sync.Issue.GithubIssue do
3737
|> GithubIssue.changeset(payload |> Adapters.Issue.to_issue())
3838
|> Changeset.put_assoc(:github_user, github_user)
3939
|> Changeset.put_assoc(:github_repo, github_repo)
40-
|> Changeset.put_assoc(:github_pull_request, github_pull_request)
40+
|> maybe_put_github_pull_request(github_pull_request)
4141
|> Repo.insert_or_update()
4242
else
4343
{:error, error} -> {:error, error}
4444
end
4545
end
4646

47+
@spec maybe_put_github_pull_request(Changeset.t, GithubPullRequest.t | nil) :: Changeset.t
48+
defp maybe_put_github_pull_request(%Changeset{} = changeset, %GithubPullRequest{} = github_pull_request) do
49+
changeset |> Changeset.put_assoc(:github_pull_request, github_pull_request)
50+
end
51+
defp maybe_put_github_pull_request(%Changeset{} = changeset, nil) do
52+
changeset
53+
end
54+
4755
@spec find_or_init(map) :: GithubIssue.t
4856
defp find_or_init(%{"id" => github_id}) do
4957
case GithubIssue |> Repo.get_by(github_id: github_id) |> Repo.preload([:github_user, :github_repo, :github_pull_request]) do

lib/code_corps/task/service.ex

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,12 @@ defmodule CodeCorps.Task.Service do
2323
:user
2424
]
2525

26+
@type result :: {:ok, Task.t} | {:error, Changeset.t} | {:error, :github} | {:error, :task_not_found}
27+
2628
@doc ~S"""
2729
Performs all actions involved in creating a task on a project
2830
"""
29-
@spec create(map) :: {:ok, Task.t} | {:error, Changeset.t} | {:error, :github}
31+
@spec create(map) :: result
3032
def create(%{} = attributes) do
3133
Multi.new
3234
|> Multi.insert(:task, %Task{} |> Task.create_changeset(attributes))
@@ -38,22 +40,23 @@ defmodule CodeCorps.Task.Service do
3840
|> marshall_result()
3941
end
4042

41-
@spec update(Task.t, map) :: {:ok, Task.t} | {:error, Changeset.t} | {:error, :github}
43+
@spec update(Task.t, map) :: result
4244
def update(%Task{} = task, %{} = attributes) do
4345
Multi.new
4446
|> Multi.update(:task, task |> Task.update_changeset(attributes))
4547
|> Multi.run(:preload, fn %{task: %Task{} = task} ->
4648
{:ok, task |> Repo.preload(@preloads)}
4749
end)
4850
|> Multi.run(:github, (fn %{preload: %Task{} = task} -> task |> update_on_github() end))
49-
|> Repo.transaction
51+
|> Repo.transaction()
5052
|> marshall_result()
5153
end
5254

53-
@spec marshall_result(tuple) :: {:ok, Task.t} | {:error, Changeset.t} | {:error, :github}
55+
@spec marshall_result(tuple) :: result
5456
defp marshall_result({:ok, %{github: %Task{} = task}}), do: {:ok, task}
5557
defp marshall_result({:ok, %{task: %Task{} = task}}), do: {:ok, task}
5658
defp marshall_result({:error, :task, %Changeset{} = changeset, _steps}), do: {:error, changeset}
59+
defp marshall_result({:error, :github, {:error, :task_not_found}, _steps}), do: {:error, :task_not_found}
5760
defp marshall_result({:error, :github, result, _steps}) do
5861
Logger.info "An error occurred when creating/updating the task with the GitHub API"
5962
Logger.info "#{inspect result}"
@@ -70,7 +73,7 @@ defmodule CodeCorps.Task.Service do
7073
{:ok, %GithubIssue{} = github_issue} <-
7174
payload
7275
|> Sync.Issue.GithubIssue.create_or_update_issue(github_repo) do
73-
task |> link_with_github_changeset(github_issue) |> Repo.update
76+
task |> link_with_github_changeset(github_issue) |> Repo.update()
7477
else
7578
{:error, error} -> {:error, error}
7679
end
@@ -81,16 +84,16 @@ defmodule CodeCorps.Task.Service do
8184
task |> Changeset.change(%{github_issue: github_issue})
8285
end
8386

84-
@spec update_on_github(Task.t) :: {:ok, Task.t} | {:error, Changeset.t} | {:error, GitHub.api_error_struct}
87+
@spec update_on_github(Task.t) :: {:ok, Task.t} | {:error, Changeset.t} | {:error, GitHub.api_error_struct} | {:error, :task_not_found}
8588
defp update_on_github(%Task{github_repo_id: nil, github_issue_id: nil} = task), do: {:ok, task}
8689
defp update_on_github(%Task{github_repo_id: _, github_issue_id: nil} = task), do: task |> create_on_github()
8790
defp update_on_github(%Task{github_repo: github_repo} = task) do
8891
with {:ok, payload} <- GitHub.API.Issue.update(task),
89-
{:ok, %GithubIssue{}} <-
90-
payload
91-
|> Sync.Issue.GithubIssue.create_or_update_issue(github_repo) do
92-
{:ok, Task |> Repo.get(task.id)}
92+
{:ok, %GithubIssue{}} <- payload |> Sync.Issue.GithubIssue.create_or_update_issue(github_repo),
93+
%Task{} = task <- Repo.get(Task, task.id) do
94+
{:ok, task}
9395
else
96+
nil -> {:error, :task_not_found}
9497
{:error, error} -> {:error, error}
9598
end
9699
end

test/lib/code_corps/skills/skills_test.exs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
defmodule CodeCorps.AccountsTest do
1+
defmodule CodeCorps.SkillsTest do
22
@moduledoc false
33

44
use CodeCorps.DbAccessCase

test/lib/code_corps/task/service_test.exs

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,16 @@ defmodule CodeCorps.Task.ServiceTest do
55

66
import CodeCorps.GitHub.TestHelpers
77

8-
alias CodeCorps.Task
8+
alias CodeCorps.{GithubIssue, Repo, Task}
99

1010
@base_attrs %{
1111
"title" => "Test task",
1212
"markdown" => "A test task",
1313
"status" => "open"
1414
}
1515

16+
@issue_payload load_endpoint_fixture("issue")
17+
1618
defp valid_attrs() do
1719
project = insert(:project)
1820
task_list = insert(:task_list, project: project, inbox: true)
@@ -106,7 +108,7 @@ defmodule CodeCorps.Task.ServiceTest do
106108
assert updated_task.id == task.id
107109
assert updated_task.title == @update_attrs["title"]
108110
assert updated_task.markdown == @update_attrs["markdown"]
109-
assert updated_task.body != task.body
111+
refute updated_task.body == task.body
110112
refute task.github_issue_id
111113
refute task.github_repo_id
112114

@@ -159,13 +161,40 @@ defmodule CodeCorps.Task.ServiceTest do
159161
assert updated_task.id == task.id
160162
assert updated_task.title == @update_attrs["title"]
161163
assert updated_task.markdown == @update_attrs["markdown"]
162-
assert updated_task.body != task.body
164+
refute updated_task.body == task.body
163165
assert updated_task.github_issue_id
164166
assert updated_task.github_repo_id
165167

166168
assert_received({:patch, "https://api.github.com/repos/foo/bar/issues/5", _body, _headers, _options})
167169
end
168170

171+
test "propagates changes to github if task is synced to github pull request" do
172+
%{
173+
"id" => issue_github_id,
174+
"number" => number
175+
} = @issue_payload
176+
177+
github_repo = insert(:github_repo, github_account_login: "octocat", name: "Hello-World")
178+
github_pull_request = insert(:github_pull_request)
179+
github_issue = insert(:github_issue, github_id: issue_github_id, number: number, github_pull_request: github_pull_request, github_repo: github_repo)
180+
task = insert(:task, github_repo: github_repo, github_issue: github_issue)
181+
182+
{:ok, updated_task} = task |> Task.Service.update(@update_attrs)
183+
184+
assert_received({:patch, "https://api.github.com/repos/octocat/Hello-World/issues/1347", _body, _headers, _options})
185+
186+
assert updated_task.id == task.id
187+
assert updated_task.title == @update_attrs["title"]
188+
assert updated_task.markdown == @update_attrs["markdown"]
189+
refute updated_task.body == task.body
190+
assert updated_task.github_issue_id == github_issue.id
191+
assert updated_task.github_repo_id == github_repo.id
192+
193+
updated_github_issue = Repo.one(GithubIssue)
194+
195+
assert updated_github_issue.github_pull_request_id == github_pull_request.id
196+
end
197+
169198
test "reports {:error, :github}, makes no changes at all if there is a github api error" do
170199
github_repo =
171200
:github_repo

0 commit comments

Comments
 (0)