Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Add repo collaborators API #89

Merged
merged 2 commits into from
Jun 15, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ Tentacool + Cat = Tentacat
* Branches
* Statuses
* Deployments
* Collaborators

Documentation can be found [here](https://hexdocs.pm/tentacat)

Expand Down
61 changes: 61 additions & 0 deletions lib/tentacat/repositories/collaborators.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
defmodule Tentacat.Repositories.Collaborators do
import Tentacat
alias Tentacat.Client

@doc """
List collaborators for a specific repository

## Example
Tentacat.Repositories.Collaborators.list "elixir-lang", "elixir"
Tentacat.Repositories.Collaborators.list "elixir-lang", "elixir", client

More info at: https://developer.github.com/v3/repos/collaborators/#list-collaborators
"""
@spec list(binary, binary, Client.t) :: Tentacat.response
def list(owner, repo, client \\ %Client{}) do
get "repos/#{owner}/#{repo}/collaborators", client
end

@doc """
Check if a user is a collaborator

## Example
Tentacat.Repositories.Collaborators.collaborator? "elixir-lang", "elixir", "username"
Tentacat.Repositories.Collaborators.collaborator? "elixir-lang", "elixir", "username", client

More info at: https://developer.github.com/v3/repos/collaborators/#check-if-a-user-is-a-collaborator
"""
@spec collaborator?(binary, binary, binary, Client.t) :: Tentacat.response
def collaborator?(owner, repo, username, client \\ %Client{}) do
get "repos/#{owner}/#{repo}/collaborators/#{username}", client
end

@doc """
Add user as a collaborator

## Example
Tentacat.Repositories.Collaborators.add "elixir-lang", "elixir", "username", %{}
Tentacat.Repositories.Collaborators.add "elixir-lang", "elixir", "username", %{ permission: "push" }, client
Tentacat.Repositories.Collaborators.add "elixir-lang", "elixir", "username", %{}, client

More info at: https://developer.github.com/v3/repos/collaborators/#add-user-as-a-collaborator
"""
@spec add(binary, binary, binary, map, Client.t) :: Tentacat.response
def add(owner, repo, username, body, client \\ %Client{}) do
put "repos/#{owner}/#{repo}/collaborators/#{username}", client, body
end

@doc """
Remove user as a collaborator

## Example
Tentacat.Repositories.Collaborators.delete "elixir-lang", "elixir", "username"
Tentacat.Repositories.Collaborators.delete "elixir-lang", "elixir", "username", client

More info at: https://developer.github.com/v3/repos/collaborators/#remove-user-as-a-collaborator
"""
@spec delete(binary, binary, binary, Client.t) :: Tentacat.response
def delete(owner, repo, username, client \\ %Client{}) do
Tentacat.delete "repos/#{owner}/#{repo}/collaborators/#{username}", client
end
end
41 changes: 41 additions & 0 deletions test/fixture/vcr_cassettes/repositories/collaborators#add.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
[
{
"request": {
"body": "{}",
"headers": {
"User-agent": "tentacat",
"Authorization": "token yourtokencomeshere"
},
"method": "put",
"options": [],
"request_body": "",
"url": "https://api.github.com/repos/andersklenke/tentatest/collaborators/tentatest123"
},
"response": {
"body": "",
"headers": {
"Server": "github.com",
"Date": "Wed, 15 Jun 2016 08:59:44 GMT",
"Status": "204 No Content",
"X-RateLimit-Limit": "5000",
"X-RateLimit-Remaining": "4949",
"X-RateLimit-Reset": "1465981243",
"X-OAuth-Scopes": "admin:gpg_key, admin:org, admin:org_hook, admin:public_key, admin:repo_hook, delete_repo, gist, notifications, repo, user",
"X-Accepted-OAuth-Scopes": "",
"X-GitHub-Media-Type": "github.v3; format=json",
"Access-Control-Expose-Headers": "ETag, Link, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval",
"Access-Control-Allow-Origin": "*",
"Content-Security-Policy": "default-src 'none'",
"Strict-Transport-Security": "max-age=31536000; includeSubdomains; preload",
"X-Content-Type-Options": "nosniff",
"X-Frame-Options": "deny",
"X-XSS-Protection": "1; mode=block",
"Vary": "Accept-Encoding",
"X-Served-By": "7f48e2f7761567e923121f17538d7a6d",
"X-GitHub-Request-Id": "B976FA36:1271A:33781696:576118FF"
},
"status_code": 204,
"type": "ok"
}
}
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
[
{
"request": {
"body": "\"\\\"\\\"\"",
"headers": {
"User-agent": "tentacat",
"Authorization": "token yourtokencomeshere"
},
"method": "get",
"options": [],
"request_body": "",
"url": "https://api.github.com/repos/andersklenke/tentatest/collaborators/andersklenke"
},
"response": {
"body": "",
"headers": {
"Server": "github.com",
"Date": "Wed, 15 Jun 2016 08:59:44 GMT",
"Status": "204 No Content",
"X-RateLimit-Limit": "5000",
"X-RateLimit-Remaining": "4948",
"X-RateLimit-Reset": "1465981243",
"X-OAuth-Scopes": "admin:gpg_key, admin:org, admin:org_hook, admin:public_key, admin:repo_hook, delete_repo, gist, notifications, repo, user",
"X-Accepted-OAuth-Scopes": "",
"X-GitHub-Media-Type": "github.v3; format=json",
"Access-Control-Expose-Headers": "ETag, Link, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval",
"Access-Control-Allow-Origin": "*",
"Content-Security-Policy": "default-src 'none'",
"Strict-Transport-Security": "max-age=31536000; includeSubdomains; preload",
"X-Content-Type-Options": "nosniff",
"X-Frame-Options": "deny",
"X-XSS-Protection": "1; mode=block",
"Vary": "Accept-Encoding",
"X-Served-By": "a6882e5cd2513376cb9481dbcd83f3a2",
"X-GitHub-Request-Id": "B976FA36:1271A:33781727:57611900"
},
"status_code": 204,
"type": "ok"
}
},
{
"request": {
"body": "\"\\\"\\\"\"",
"headers": {
"User-agent": "tentacat",
"Authorization": "token yourtokencomeshere"
},
"method": "get",
"options": [],
"request_body": "",
"url": "https://api.github.com/repos/andersklenke/tentatest/collaborators/no"
},
"response": {
"body": "{\"message\":\"Not Found\",\"documentation_url\":\"https://developer.github.com/v3\"}",
"headers": {
"Server": "github.com",
"Date": "Wed, 15 Jun 2016 08:59:44 GMT",
"Content-Type": "application/json; charset=utf-8",
"Content-Length": "77",
"Status": "404 Not Found",
"X-RateLimit-Limit": "5000",
"X-RateLimit-Remaining": "4947",
"X-RateLimit-Reset": "1465981243",
"X-OAuth-Scopes": "admin:gpg_key, admin:org, admin:org_hook, admin:public_key, admin:repo_hook, delete_repo, gist, notifications, repo, user",
"X-Accepted-OAuth-Scopes": "",
"X-GitHub-Media-Type": "github.v3; format=json",
"Access-Control-Expose-Headers": "ETag, Link, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval",
"Access-Control-Allow-Origin": "*",
"Content-Security-Policy": "default-src 'none'",
"Strict-Transport-Security": "max-age=31536000; includeSubdomains; preload",
"X-Content-Type-Options": "nosniff",
"X-Frame-Options": "deny",
"X-XSS-Protection": "1; mode=block",
"X-GitHub-Request-Id": "B976FA36:1271A:33781778:57611900"
},
"status_code": 404,
"type": "ok"
}
}
]
41 changes: 41 additions & 0 deletions test/fixture/vcr_cassettes/repositories/collaborators#delete.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
[
{
"request": {
"body": "\"\"",
"headers": {
"User-agent": "tentacat",
"Authorization": "token yourtokencomeshere"
},
"method": "delete",
"options": [],
"request_body": "",
"url": "https://api.github.com/repos/andersklenke/tentatest/collaborators/tentatest123"
},
"response": {
"body": "",
"headers": {
"Server": "github.com",
"Date": "Wed, 15 Jun 2016 08:59:45 GMT",
"Status": "204 No Content",
"X-RateLimit-Limit": "5000",
"X-RateLimit-Remaining": "4946",
"X-RateLimit-Reset": "1465981243",
"X-OAuth-Scopes": "admin:gpg_key, admin:org, admin:org_hook, admin:public_key, admin:repo_hook, delete_repo, gist, notifications, repo, user",
"X-Accepted-OAuth-Scopes": "",
"X-GitHub-Media-Type": "github.v3; format=json",
"Access-Control-Expose-Headers": "ETag, Link, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval",
"Access-Control-Allow-Origin": "*",
"Content-Security-Policy": "default-src 'none'",
"Strict-Transport-Security": "max-age=31536000; includeSubdomains; preload",
"X-Content-Type-Options": "nosniff",
"X-Frame-Options": "deny",
"X-XSS-Protection": "1; mode=block",
"Vary": "Accept-Encoding",
"X-Served-By": "ef96c2e493b28ffea49b891b085ed2dd",
"X-GitHub-Request-Id": "B976FA36:1271A:3378179B:57611900"
},
"status_code": 204,
"type": "ok"
}
}
]
45 changes: 45 additions & 0 deletions test/fixture/vcr_cassettes/repositories/collaborators#list.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
[
{
"request": {
"body": "\"\\\"\\\"\"",
"headers": {
"User-agent": "tentacat",
"Authorization": "token yourtokencomeshere"
},
"method": "get",
"options": [],
"request_body": "",
"url": "https://api.github.com/repos/andersklenke/tentatest/collaborators"
},
"response": {
"body": "[{\"login\":\"andersklenke\",\"id\":3286533,\"avatar_url\":\"https://avatars.githubusercontent.com/u/3286533?v=3\",\"gravatar_id\":\"\",\"url\":\"https://api.github.com/users/andersklenke\",\"html_url\":\"https://github.com/andersklenke\",\"followers_url\":\"https://api.github.com/users/andersklenke/followers\",\"following_url\":\"https://api.github.com/users/andersklenke/following{/other_user}\",\"gists_url\":\"https://api.github.com/users/andersklenke/gists{/gist_id}\",\"starred_url\":\"https://api.github.com/users/andersklenke/starred{/owner}{/repo}\",\"subscriptions_url\":\"https://api.github.com/users/andersklenke/subscriptions\",\"organizations_url\":\"https://api.github.com/users/andersklenke/orgs\",\"repos_url\":\"https://api.github.com/users/andersklenke/repos\",\"events_url\":\"https://api.github.com/users/andersklenke/events{/privacy}\",\"received_events_url\":\"https://api.github.com/users/andersklenke/received_events\",\"type\":\"User\",\"site_admin\":false,\"permissions\":{\"admin\":true,\"push\":true,\"pull\":true}}]",
"headers": {
"Server": "github.com",
"Date": "Wed, 15 Jun 2016 08:59:45 GMT",
"Content-Type": "application/json; charset=utf-8",
"Content-Length": "975",
"Status": "200 OK",
"X-RateLimit-Limit": "5000",
"X-RateLimit-Remaining": "4945",
"X-RateLimit-Reset": "1465981243",
"Cache-Control": "private, max-age=60, s-maxage=60",
"Vary": "Accept, Authorization, Cookie, X-GitHub-OTP",
"ETag": "\"e8091b15e464f7d0c3bc78316a7d0314\"",
"X-OAuth-Scopes": "admin:gpg_key, admin:org, admin:org_hook, admin:public_key, admin:repo_hook, delete_repo, gist, notifications, repo, user",
"X-Accepted-OAuth-Scopes": "",
"X-GitHub-Media-Type": "github.v3; format=json",
"Access-Control-Expose-Headers": "ETag, Link, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval",
"Access-Control-Allow-Origin": "*",
"Content-Security-Policy": "default-src 'none'",
"Strict-Transport-Security": "max-age=31536000; includeSubdomains; preload",
"X-Content-Type-Options": "nosniff",
"X-Frame-Options": "deny",
"X-XSS-Protection": "1; mode=block",
"X-Served-By": "07ff1c8a09e44b62e277fae50a1b1dc4",
"X-GitHub-Request-Id": "B976FA36:1271A:337817EA:57611901"
},
"status_code": 200,
"type": "ok"
}
}
]
38 changes: 38 additions & 0 deletions test/repositories/collaborators_test.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
defmodule Tentacat.Repositories.CollaboratorsTest do
use ExUnit.Case, async: false
use ExVCR.Mock, adapter: ExVCR.Adapter.Hackney
import Tentacat.Repositories.Collaborators

doctest Tentacat.Repositories.Collaborators

@client Tentacat.Client.new(%{access_token: "yourtokencomeshere"})

setup_all do
HTTPoison.start
end

test "list/3" do
use_cassette "repositories/collaborators#list" do
assert list("andersklenke", "tentatest", @client) |> Enum.count() == 1
end
end

test "collaborator?/4" do
use_cassette "repositories/collaborators#collaborator?" do
assert {204, _} = collaborator?("andersklenke", "tentatest", "andersklenke", @client)
assert {404, _} = collaborator?("andersklenke", "tentatest", "no", @client)
end
end

test "add/4" do
use_cassette "repositories/collaborators#add" do
assert {204, _} = add("andersklenke", "tentatest", "tentatest123", %{}, @client)
end
end

test "delete/4" do
use_cassette "repositories/collaborators#delete" do
assert {204, _} = delete("andersklenke", "tentatest", "tentatest123", @client)
end
end
end