package github_webhooks

import (
	"net/http"
	"net/http/httptest"
	"strings"
	"testing"
)

func TestCommitCommentEvent(t *testing.T) {
	gh := NewGithubWebhooks()
	jsonString := CommitCommentEventJSON()
	req, _ := http.NewRequest("POST", "/", strings.NewReader(jsonString))
	req.Header.Add("X-Github-Event", "commit_comment")
	w := httptest.NewRecorder()
	gh.eventHandler(w, req)
	if w.Code != http.StatusOK {
		t.Errorf("POST commit_comment returned HTTP status code %v.\nExpected %v", w.Code, http.StatusOK)
	}
}

func TestDeleteEvent(t *testing.T) {
	gh := NewGithubWebhooks()
	jsonString := DeleteEventJSON()
	req, _ := http.NewRequest("POST", "/", strings.NewReader(jsonString))
	req.Header.Add("X-Github-Event", "delete")
	w := httptest.NewRecorder()
	gh.eventHandler(w, req)
	if w.Code != http.StatusOK {
		t.Errorf("POST commit_comment returned HTTP status code %v.\nExpected %v", w.Code, http.StatusOK)
	}
}

func TestDeploymentEvent(t *testing.T) {
	gh := NewGithubWebhooks()
	jsonString := DeploymentEventJSON()
	req, _ := http.NewRequest("POST", "/", strings.NewReader(jsonString))
	req.Header.Add("X-Github-Event", "deployment")
	w := httptest.NewRecorder()
	gh.eventHandler(w, req)
	if w.Code != http.StatusOK {
		t.Errorf("POST commit_comment returned HTTP status code %v.\nExpected %v", w.Code, http.StatusOK)
	}
}

func TestDeploymentStatusEvent(t *testing.T) {
	gh := NewGithubWebhooks()
	jsonString := DeploymentStatusEventJSON()
	req, _ := http.NewRequest("POST", "/", strings.NewReader(jsonString))
	req.Header.Add("X-Github-Event", "deployment_status")
	w := httptest.NewRecorder()
	gh.eventHandler(w, req)
	if w.Code != http.StatusOK {
		t.Errorf("POST commit_comment returned HTTP status code %v.\nExpected %v", w.Code, http.StatusOK)
	}
}

func TestForkEvent(t *testing.T) {
	gh := NewGithubWebhooks()
	jsonString := ForkEventJSON()
	req, _ := http.NewRequest("POST", "/", strings.NewReader(jsonString))
	req.Header.Add("X-Github-Event", "fork")
	w := httptest.NewRecorder()
	gh.eventHandler(w, req)
	if w.Code != http.StatusOK {
		t.Errorf("POST commit_comment returned HTTP status code %v.\nExpected %v", w.Code, http.StatusOK)
	}
}

func TestGollumEvent(t *testing.T) {
	gh := NewGithubWebhooks()
	jsonString := GollumEventJSON()
	req, _ := http.NewRequest("POST", "/", strings.NewReader(jsonString))
	req.Header.Add("X-Github-Event", "gollum")
	w := httptest.NewRecorder()
	gh.eventHandler(w, req)
	if w.Code != http.StatusOK {
		t.Errorf("POST commit_comment returned HTTP status code %v.\nExpected %v", w.Code, http.StatusOK)
	}
}

func TestIssueCommentEvent(t *testing.T) {
	gh := NewGithubWebhooks()
	jsonString := IssueCommentEventJSON()
	req, _ := http.NewRequest("POST", "/", strings.NewReader(jsonString))
	req.Header.Add("X-Github-Event", "issue_comment")
	w := httptest.NewRecorder()
	gh.eventHandler(w, req)
	if w.Code != http.StatusOK {
		t.Errorf("POST commit_comment returned HTTP status code %v.\nExpected %v", w.Code, http.StatusOK)
	}
}

func TestIssuesEvent(t *testing.T) {
	gh := NewGithubWebhooks()
	jsonString := IssuesEventJSON()
	req, _ := http.NewRequest("POST", "/", strings.NewReader(jsonString))
	req.Header.Add("X-Github-Event", "issues")
	w := httptest.NewRecorder()
	gh.eventHandler(w, req)
	if w.Code != http.StatusOK {
		t.Errorf("POST commit_comment returned HTTP status code %v.\nExpected %v", w.Code, http.StatusOK)
	}
}

func TestMemberEvent(t *testing.T) {
	gh := NewGithubWebhooks()
	jsonString := MemberEventJSON()
	req, _ := http.NewRequest("POST", "/", strings.NewReader(jsonString))
	req.Header.Add("X-Github-Event", "member")
	w := httptest.NewRecorder()
	gh.eventHandler(w, req)
	if w.Code != http.StatusOK {
		t.Errorf("POST commit_comment returned HTTP status code %v.\nExpected %v", w.Code, http.StatusOK)
	}
}

func TestMembershipEvent(t *testing.T) {
	gh := NewGithubWebhooks()
	jsonString := MembershipEventJSON()
	req, _ := http.NewRequest("POST", "/", strings.NewReader(jsonString))
	req.Header.Add("X-Github-Event", "membership")
	w := httptest.NewRecorder()
	gh.eventHandler(w, req)
	if w.Code != http.StatusOK {
		t.Errorf("POST commit_comment returned HTTP status code %v.\nExpected %v", w.Code, http.StatusOK)
	}
}

func TestPageBuildEvent(t *testing.T) {
	gh := NewGithubWebhooks()
	jsonString := PageBuildEventJSON()
	req, _ := http.NewRequest("POST", "/", strings.NewReader(jsonString))
	req.Header.Add("X-Github-Event", "page_build")
	w := httptest.NewRecorder()
	gh.eventHandler(w, req)
	if w.Code != http.StatusOK {
		t.Errorf("POST commit_comment returned HTTP status code %v.\nExpected %v", w.Code, http.StatusOK)
	}
}

func TestPublicEvent(t *testing.T) {
	gh := NewGithubWebhooks()
	jsonString := PublicEventJSON()
	req, _ := http.NewRequest("POST", "/", strings.NewReader(jsonString))
	req.Header.Add("X-Github-Event", "public")
	w := httptest.NewRecorder()
	gh.eventHandler(w, req)
	if w.Code != http.StatusOK {
		t.Errorf("POST commit_comment returned HTTP status code %v.\nExpected %v", w.Code, http.StatusOK)
	}
}

func TestPullRequestReviewCommentEvent(t *testing.T) {
	gh := NewGithubWebhooks()
	jsonString := PullRequestReviewCommentEventJSON()
	req, _ := http.NewRequest("POST", "/", strings.NewReader(jsonString))
	req.Header.Add("X-Github-Event", "pull_request_review_comment")
	w := httptest.NewRecorder()
	gh.eventHandler(w, req)
	if w.Code != http.StatusOK {
		t.Errorf("POST commit_comment returned HTTP status code %v.\nExpected %v", w.Code, http.StatusOK)
	}
}

func TestPushEvent(t *testing.T) {
	gh := NewGithubWebhooks()
	jsonString := PushEventJSON()
	req, _ := http.NewRequest("POST", "/", strings.NewReader(jsonString))
	req.Header.Add("X-Github-Event", "push")
	w := httptest.NewRecorder()
	gh.eventHandler(w, req)
	if w.Code != http.StatusOK {
		t.Errorf("POST commit_comment returned HTTP status code %v.\nExpected %v", w.Code, http.StatusOK)
	}
}

func TestReleaseEvent(t *testing.T) {
	gh := NewGithubWebhooks()
	jsonString := ReleaseEventJSON()
	req, _ := http.NewRequest("POST", "/", strings.NewReader(jsonString))
	req.Header.Add("X-Github-Event", "release")
	w := httptest.NewRecorder()
	gh.eventHandler(w, req)
	if w.Code != http.StatusOK {
		t.Errorf("POST commit_comment returned HTTP status code %v.\nExpected %v", w.Code, http.StatusOK)
	}
}

func TestRepositoryEvent(t *testing.T) {
	gh := NewGithubWebhooks()
	jsonString := RepositoryEventJSON()
	req, _ := http.NewRequest("POST", "/", strings.NewReader(jsonString))
	req.Header.Add("X-Github-Event", "repository")
	w := httptest.NewRecorder()
	gh.eventHandler(w, req)
	if w.Code != http.StatusOK {
		t.Errorf("POST commit_comment returned HTTP status code %v.\nExpected %v", w.Code, http.StatusOK)
	}
}

func TestStatusEvent(t *testing.T) {
	gh := NewGithubWebhooks()

	jsonString := StatusEventJSON()
	req, _ := http.NewRequest("POST", "/", strings.NewReader(jsonString))
	req.Header.Add("X-Github-Event", "status")
	w := httptest.NewRecorder()
	gh.eventHandler(w, req)
	if w.Code != http.StatusOK {
		t.Errorf("POST commit_comment returned HTTP status code %v.\nExpected %v", w.Code, http.StatusOK)
	}
}

func TestTeamAddEvent(t *testing.T) {
	gh := NewGithubWebhooks()
	jsonString := TeamAddEventJSON()
	req, _ := http.NewRequest("POST", "/", strings.NewReader(jsonString))
	req.Header.Add("X-Github-Event", "team_add")
	w := httptest.NewRecorder()
	gh.eventHandler(w, req)
	if w.Code != http.StatusOK {
		t.Errorf("POST commit_comment returned HTTP status code %v.\nExpected %v", w.Code, http.StatusOK)
	}
}

func TestWatchEvent(t *testing.T) {
	gh := NewGithubWebhooks()
	jsonString := WatchEventJSON()
	req, _ := http.NewRequest("POST", "/", strings.NewReader(jsonString))
	req.Header.Add("X-Github-Event", "watch")
	w := httptest.NewRecorder()
	gh.eventHandler(w, req)
	if w.Code != http.StatusOK {
		t.Errorf("POST commit_comment returned HTTP status code %v.\nExpected %v", w.Code, http.StatusOK)
	}
}