Skip to content

Commit a8dd7b2

Browse files
authored
Merge pull request #1079 from code-corps/1078-fix-order-from-github
Set order on tasks from issues/PRs coming from GitHub
2 parents e138991 + 19e749c commit a8dd7b2

File tree

9 files changed

+56
-2
lines changed

9 files changed

+56
-2
lines changed

lib/code_corps/github/event/issues/changeset_builder.ex

+2
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ defmodule CodeCorps.GitHub.Event.Issues.ChangesetBuilder do
6565
|> Changeset.assoc_constraint(:project)
6666
|> Changeset.assoc_constraint(:task_list)
6767
|> Changeset.assoc_constraint(:user)
68+
|> Task.order_task()
6869
end
6970

7071
@update_attrs ~w(markdown modified_at status title)a
@@ -79,5 +80,6 @@ defmodule CodeCorps.GitHub.Event.Issues.ChangesetBuilder do
7980
|> Changeset.assoc_constraint(:github_repo)
8081
|> Changeset.assoc_constraint(:project)
8182
|> Changeset.assoc_constraint(:user)
83+
|> Task.order_task()
8284
end
8385
end

lib/code_corps/github/event/pull_request/changeset_builder.ex

+2
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ defmodule CodeCorps.GitHub.Event.PullRequest.ChangesetBuilder do
6565
|> Changeset.assoc_constraint(:project)
6666
|> Changeset.assoc_constraint(:task_list)
6767
|> Changeset.assoc_constraint(:user)
68+
|> Task.order_task()
6869
end
6970

7071
@update_attrs ~w(markdown modified_at status title)a
@@ -79,5 +80,6 @@ defmodule CodeCorps.GitHub.Event.PullRequest.ChangesetBuilder do
7980
|> Changeset.assoc_constraint(:github_repo)
8081
|> Changeset.assoc_constraint(:project)
8182
|> Changeset.assoc_constraint(:user)
83+
|> Task.order_task()
8284
end
8385
end

lib/code_corps/model/task.ex

+6-1
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,14 @@ defmodule CodeCorps.Task do
4444
|> cast(params, [:title, :markdown, :task_list_id, :position])
4545
|> validate_required([:title, :task_list_id])
4646
|> assoc_constraint(:task_list)
47+
|> order_task()
48+
|> MarkdownRendererService.render_markdown_to_html(:markdown, :body)
49+
end
50+
51+
def order_task(changeset) do
52+
changeset
4753
|> apply_position()
4854
|> set_order(:position, :order, :task_list_id)
49-
|> MarkdownRendererService.render_markdown_to_html(:markdown, :body)
5055
end
5156

5257
@spec create_changeset(struct, map) :: Ecto.Changeset.t

lib/code_corps/task/service.ex

+11-1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,12 @@ defmodule CodeCorps.Task.Service do
2222
end
2323

2424
@spec update(Task.t, map) :: {:ok, Task.t} | {:error, Changeset.t} | {:error, :github}
25+
def update(%Task{github_issue_id: nil} = task, %{} = attributes) do
26+
Multi.new
27+
|> Multi.update(:task, task |> Task.update_changeset(attributes))
28+
|> Repo.transaction
29+
|> marshall_result()
30+
end
2531
def update(%Task{} = task, %{} = attributes) do
2632
Multi.new
2733
|> Multi.update(:task, task |> Task.update_changeset(attributes))
@@ -32,6 +38,7 @@ defmodule CodeCorps.Task.Service do
3238

3339
@spec marshall_result(tuple) :: {:ok, Task.t} | {:error, Changeset.t} | {:error, :github}
3440
defp marshall_result({:ok, %{github: %Task{} = task}}), do: {:ok, task}
41+
defp marshall_result({:ok, %{task: %Task{} = task}}), do: {:ok, task}
3542
defp marshall_result({:error, :task, %Changeset{} = changeset, _steps}), do: {:error, changeset}
3643
defp marshall_result({:error, :github, result, _steps}) do
3744
Logger.info "An error occurred when creating/updating the task with the GitHub API"
@@ -50,7 +57,10 @@ defmodule CodeCorps.Task.Service do
5057
@preloads [:github_issue, [github_repo: :github_app_installation], :user, [project: :organization]]
5158

5259
@spec create_on_github(Task.t) :: {:ok, Task.t} :: {:error, GitHub.api_error_struct}
53-
defp create_on_github(%Task{github_repo_id: nil} = task), do: {:ok, task}
60+
defp create_on_github(%Task{github_repo_id: nil} = task) do
61+
# Don't create: no GitHub repo was selected
62+
{:ok, task}
63+
end
5464
defp create_on_github(%Task{github_repo: _} = task) do
5565
with %Task{github_repo: github_repo} = task <- task |> Repo.preload(@preloads),
5666
{:ok, payload} <- GitHub.Issue.create(task),

test/lib/code_corps/github/event/issues/changeset_builder_test.exs

+1
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ defmodule CodeCorps.GitHub.Event.Issues.ChangesetBuilderTest do
5252
assert get_change(changeset, :user_id) == user.id
5353

5454
assert changeset.valid?
55+
assert changeset.changes[:position]
5556
end
5657

5758
test "validates that modified_at has not already happened" do

test/lib/code_corps/github/event/issues_test.exs

+8
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ defmodule CodeCorps.GitHub.Event.IssuesTest do
6565
assert task.title == title
6666
assert task.github_issue.number == number
6767
assert task.status == "open"
68+
assert task.order
6869
end)
6970
end
7071

@@ -113,6 +114,7 @@ defmodule CodeCorps.GitHub.Event.IssuesTest do
113114
assert task.title == title
114115
assert task.github_issue.number == number
115116
assert task.status == "open"
117+
assert task.order
116118
end)
117119

118120
assert existing_task_id in (tasks |> Enum.map(&Map.get(&1, :id)))
@@ -182,6 +184,7 @@ defmodule CodeCorps.GitHub.Event.IssuesTest do
182184
assert task.title == title
183185
assert task.github_issue.number == number
184186
assert task.status == "closed"
187+
assert task.order
185188
end)
186189
end
187190

@@ -230,6 +233,7 @@ defmodule CodeCorps.GitHub.Event.IssuesTest do
230233
assert task.title == title
231234
assert task.github_issue.number == number
232235
assert task.status == "closed"
236+
assert task.order
233237
end)
234238

235239
assert existing_task_id in (tasks |> Enum.map(&Map.get(&1, :id)))
@@ -299,6 +303,7 @@ defmodule CodeCorps.GitHub.Event.IssuesTest do
299303
assert task.title == title
300304
assert task.github_issue.number == number
301305
assert task.status == "open"
306+
assert task.order
302307
end)
303308
end
304309

@@ -347,6 +352,7 @@ defmodule CodeCorps.GitHub.Event.IssuesTest do
347352
assert task.title == title
348353
assert task.github_issue.number == number
349354
assert task.status == "open"
355+
assert task.order
350356
end)
351357

352358
assert existing_task_id in (tasks |> Enum.map(&Map.get(&1, :id)))
@@ -416,6 +422,7 @@ defmodule CodeCorps.GitHub.Event.IssuesTest do
416422
assert task.title == title
417423
assert task.github_issue.number == number
418424
assert task.status == "open"
425+
assert task.order
419426
end)
420427
end
421428

@@ -464,6 +471,7 @@ defmodule CodeCorps.GitHub.Event.IssuesTest do
464471
assert task.title == title
465472
assert task.github_issue.number == number
466473
assert task.status == "open"
474+
assert task.order
467475
end)
468476

469477
assert existing_task_id in (tasks |> Enum.map(&Map.get(&1, :id)))

test/lib/code_corps/github/event/pull_request/changeset_builder_test.exs

+1
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ defmodule CodeCorps.GitHub.Event.PullRequest.ChangesetBuilderTest do
5252
assert get_change(changeset, :user_id) == user.id
5353

5454
assert changeset.valid?
55+
assert changeset.changes[:position]
5556
end
5657

5758
test "validates that modified_at has not already happened" do

test/lib/code_corps/github/event/pull_request_test.exs

+7
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ defmodule CodeCorps.GitHub.Event.PullRequestTest do
113113
assert task.title == title
114114
assert task.github_pull_request.number == number
115115
assert task.status == "open"
116+
assert task.order
116117
end)
117118

118119
assert existing_task_id in (tasks |> Enum.map(&Map.get(&1, :id)))
@@ -182,6 +183,7 @@ defmodule CodeCorps.GitHub.Event.PullRequestTest do
182183
assert task.title == title
183184
assert task.github_pull_request.number == number
184185
assert task.status == "closed"
186+
assert task.order
185187
end)
186188
end
187189

@@ -230,6 +232,7 @@ defmodule CodeCorps.GitHub.Event.PullRequestTest do
230232
assert task.title == title
231233
assert task.github_pull_request.number == number
232234
assert task.status == "closed"
235+
assert task.order
233236
end)
234237

235238
assert existing_task_id in (tasks |> Enum.map(&Map.get(&1, :id)))
@@ -299,6 +302,7 @@ defmodule CodeCorps.GitHub.Event.PullRequestTest do
299302
assert task.title == title
300303
assert task.github_pull_request.number == number
301304
assert task.status == "open"
305+
assert task.order
302306
end)
303307
end
304308

@@ -347,6 +351,7 @@ defmodule CodeCorps.GitHub.Event.PullRequestTest do
347351
assert task.title == title
348352
assert task.github_pull_request.number == number
349353
assert task.status == "open"
354+
assert task.order
350355
end)
351356

352357
assert existing_task_id in (tasks |> Enum.map(&Map.get(&1, :id)))
@@ -416,6 +421,7 @@ defmodule CodeCorps.GitHub.Event.PullRequestTest do
416421
assert task.title == title
417422
assert task.github_pull_request.number == number
418423
assert task.status == "open"
424+
assert task.order
419425
end)
420426
end
421427

@@ -464,6 +470,7 @@ defmodule CodeCorps.GitHub.Event.PullRequestTest do
464470
assert task.title == title
465471
assert task.github_pull_request.number == number
466472
assert task.status == "open"
473+
assert task.order
467474
end)
468475

469476
assert existing_task_id in (tasks |> Enum.map(&Map.get(&1, :id)))

test/lib/code_corps/task/service_test.exs

+18
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,24 @@ defmodule CodeCorps.Task.ServiceTest do
137137
assert_received({:patch, "https://api.github.com/repos/foo/bar/issues/5", _headers, _body, _options})
138138
end
139139

140+
test "does not propagate changes to github if task is synced to github pull request" do
141+
github_repo =
142+
:github_repo
143+
|> insert(github_account_login: "foo", name: "bar")
144+
145+
github_pull_request = insert(:github_pull_request, number: 5)
146+
task = insert(:task, github_repo: github_repo, github_pull_request: github_pull_request)
147+
148+
{:ok, updated_task} = task |> Task.Service.update(@update_attrs)
149+
150+
assert updated_task.id == task.id
151+
assert updated_task.title == @update_attrs["title"]
152+
assert updated_task.markdown == @update_attrs["markdown"]
153+
assert updated_task.body != task.body
154+
assert updated_task.github_pull_request_id
155+
assert updated_task.github_repo_id
156+
end
157+
140158
test "reports {:error, :github}, makes no changes at all if there is a github api error" do
141159
github_repo =
142160
:github_repo

0 commit comments

Comments
 (0)