txgh-server 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/txgh-server/version.rb +1 -1
- data/lib/txgh-server/webhooks/github/delete_attributes.rb +50 -0
- data/lib/txgh-server/webhooks/github/delete_handler.rb +12 -4
- data/lib/txgh-server/webhooks/github/ping_handler.rb +4 -1
- data/lib/txgh-server/webhooks/github/push_attributes.rb +77 -0
- data/lib/txgh-server/webhooks/github/push_handler.rb +23 -61
- data/lib/txgh-server/webhooks/github/request_handler.rb +45 -51
- data/lib/txgh-server/webhooks/github.rb +7 -5
- data/lib/txgh-server/webhooks/transifex/hook_handler.rb +1 -1
- data/spec/application_spec.rb +8 -4
- data/spec/integration/hooks_spec.rb +1 -15
- data/spec/webhooks/github/delete_attributes_spec.rb +30 -0
- data/spec/webhooks/github/delete_handler_spec.rb +5 -6
- data/spec/webhooks/github/ping_handler_spec.rb +2 -1
- data/spec/webhooks/github/push_attributes_spec.rb +54 -0
- data/spec/webhooks/github/push_handler_spec.rb +8 -41
- metadata +7 -5
- data/lib/txgh-server/webhooks/github/handler.rb +0 -20
- data/spec/integration/cassettes/github_l10n_hook_endpoint.yml +0 -536
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 0a618f6c8f91abd2996e3e7589eeee8d644703f9
|
|
4
|
+
data.tar.gz: db946191d261517d34c339aa98424e46a72d0b0e
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: d09779408d47e28a776cbd8dc4e2ac36c1f9f56a9d2288f0beffddfc9f6ac3d84897b20dd968e5569506a47df5340e227adc499d888753a5ffcb9ff26e5ae33d
|
|
7
|
+
data.tar.gz: 38494763dc17346acb93efab18249efb1f9be9b03416b2ab1d8177fb6465c962a7b05e8541a4532af4bc785371f343a65d2a07f6362417be27157dba9ad4781c
|
data/lib/txgh-server/version.rb
CHANGED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
module TxghServer
|
|
2
|
+
module Webhooks
|
|
3
|
+
module Github
|
|
4
|
+
class DeleteAttributes
|
|
5
|
+
ATTRIBUTES = [
|
|
6
|
+
:repo_name, :ref, :ref_type
|
|
7
|
+
]
|
|
8
|
+
|
|
9
|
+
class << self
|
|
10
|
+
def from_webhook_payload(payload)
|
|
11
|
+
new(
|
|
12
|
+
ATTRIBUTES.each_with_object({}) do |attr, ret|
|
|
13
|
+
ret[attr] = public_send(attr, payload)
|
|
14
|
+
end
|
|
15
|
+
)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def repo_name(payload)
|
|
19
|
+
payload.fetch('repository').fetch('full_name')
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def ref(payload)
|
|
23
|
+
payload.fetch('ref')
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def ref_type(payload)
|
|
27
|
+
payload.fetch('ref_type')
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
attr_reader *ATTRIBUTES
|
|
32
|
+
|
|
33
|
+
def initialize(options = {})
|
|
34
|
+
ATTRIBUTES.each do |attr|
|
|
35
|
+
instance_variable_set(
|
|
36
|
+
"@#{attr}", options.fetch(attr) { options.fetch(attr.to_s) }
|
|
37
|
+
)
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def to_h
|
|
42
|
+
ATTRIBUTES.each_with_object({}) do |attr, ret|
|
|
43
|
+
ret[attr] = public_send(attr)
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
@@ -1,9 +1,17 @@
|
|
|
1
1
|
module TxghServer
|
|
2
2
|
module Webhooks
|
|
3
3
|
module Github
|
|
4
|
-
class DeleteHandler
|
|
4
|
+
class DeleteHandler
|
|
5
|
+
include ResponseHelpers
|
|
5
6
|
|
|
6
|
-
|
|
7
|
+
attr_reader :project, :repo, :logger, :attributes
|
|
8
|
+
|
|
9
|
+
def initialize(project, repo, logger, attributes)
|
|
10
|
+
@project = project
|
|
11
|
+
@repo = repo
|
|
12
|
+
@logger = logger
|
|
13
|
+
@attributes = attributes
|
|
14
|
+
end
|
|
7
15
|
|
|
8
16
|
def execute
|
|
9
17
|
perform_delete if should_handle_request?
|
|
@@ -22,13 +30,13 @@ module TxghServer
|
|
|
22
30
|
|
|
23
31
|
def should_handle_request?
|
|
24
32
|
# ref_type can be either 'branch' or 'tag' - we only care about branches
|
|
25
|
-
|
|
33
|
+
attributes.ref_type == 'branch' &&
|
|
26
34
|
repo.should_process_ref?(branch) &&
|
|
27
35
|
project.auto_delete_resources?
|
|
28
36
|
end
|
|
29
37
|
|
|
30
38
|
def branch
|
|
31
|
-
Txgh::Utils.absolute_branch(
|
|
39
|
+
Txgh::Utils.absolute_branch(attributes.ref.sub(/^refs\//, ''))
|
|
32
40
|
end
|
|
33
41
|
|
|
34
42
|
end
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
require 'set'
|
|
2
|
+
|
|
3
|
+
module TxghServer
|
|
4
|
+
module Webhooks
|
|
5
|
+
module Github
|
|
6
|
+
class PushAttributes
|
|
7
|
+
ATTRIBUTES = [
|
|
8
|
+
:repo_name, :ref, :before, :after,
|
|
9
|
+
:added_files, :modified_files, :author
|
|
10
|
+
]
|
|
11
|
+
|
|
12
|
+
class << self
|
|
13
|
+
def from_webhook_payload(payload)
|
|
14
|
+
new(
|
|
15
|
+
ATTRIBUTES.each_with_object({}) do |attr, ret|
|
|
16
|
+
ret[attr] = public_send(attr, payload)
|
|
17
|
+
end
|
|
18
|
+
)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def repo_name(payload)
|
|
22
|
+
payload.fetch('repository').fetch('full_name')
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def ref(payload)
|
|
26
|
+
payload.fetch('ref')
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def before(payload)
|
|
30
|
+
payload.fetch('before')
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def after(payload)
|
|
34
|
+
payload.fetch('after')
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def added_files(payload)
|
|
38
|
+
extract_files(payload, 'added')
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def modified_files(payload)
|
|
42
|
+
extract_files(payload, 'modified')
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def author(payload)
|
|
46
|
+
payload.fetch('head_commit').fetch('committer').fetch('name')
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def extract_files(payload, state)
|
|
50
|
+
payload.fetch('commits').flat_map { |c| c[state] }.uniq
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def files
|
|
55
|
+
@files ||= added_files + modified_files
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
attr_reader *ATTRIBUTES
|
|
59
|
+
|
|
60
|
+
def initialize(options = {})
|
|
61
|
+
ATTRIBUTES.each do |attr|
|
|
62
|
+
instance_variable_set(
|
|
63
|
+
"@#{attr}", options.fetch(attr) { options.fetch(attr.to_s) }
|
|
64
|
+
)
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def to_h
|
|
69
|
+
ATTRIBUTES.each_with_object({}) do |attr, ret|
|
|
70
|
+
ret[attr] = public_send(attr)
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
end
|
|
@@ -1,10 +1,19 @@
|
|
|
1
|
-
require 'base64'
|
|
2
1
|
require 'set'
|
|
3
2
|
|
|
4
3
|
module TxghServer
|
|
5
4
|
module Webhooks
|
|
6
5
|
module Github
|
|
7
|
-
class PushHandler
|
|
6
|
+
class PushHandler
|
|
7
|
+
include ResponseHelpers
|
|
8
|
+
|
|
9
|
+
attr_reader :project, :repo, :logger, :attributes
|
|
10
|
+
|
|
11
|
+
def initialize(project, repo, logger, attributes)
|
|
12
|
+
@project = project
|
|
13
|
+
@repo = repo
|
|
14
|
+
@logger = logger
|
|
15
|
+
@attributes = attributes
|
|
16
|
+
end
|
|
8
17
|
|
|
9
18
|
def execute
|
|
10
19
|
# Check if the branch in the hook data is the configured branch we want
|
|
@@ -14,31 +23,11 @@ module TxghServer
|
|
|
14
23
|
if should_process?
|
|
15
24
|
logger.info('found branch in github request')
|
|
16
25
|
|
|
17
|
-
tx_resources = tx_resources_for(branch)
|
|
18
|
-
|
|
19
|
-
modified_resources = added_and_modified_resources_for(tx_resources)
|
|
20
|
-
modified_resources += l10n_resources_for(tx_resources)
|
|
21
|
-
|
|
22
|
-
if repo.github_config_branch.include?('tags/')
|
|
23
|
-
modified_resources += tag_resources_for(tx_resources)
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
# Handle DBZ 'L10N' special case
|
|
27
|
-
if branch.include?("L10N")
|
|
28
|
-
logger.info('processing L10N tag')
|
|
29
|
-
|
|
30
|
-
# Create a new branch off tag commit
|
|
31
|
-
if branch.include?('tags/L10N')
|
|
32
|
-
repo.api.create_ref(repo.name, 'heads/L10N', payload['head_commit']['id'])
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
|
-
|
|
36
26
|
updater = Txgh::ResourceUpdater.new(project, repo, logger)
|
|
37
|
-
categories = { 'author' =>
|
|
38
|
-
ref = repo.api.get_ref(repo.name, branch)
|
|
27
|
+
categories = { 'author' => attributes.author }
|
|
39
28
|
|
|
40
|
-
|
|
41
|
-
updater.update_resource(resource,
|
|
29
|
+
added_and_modified_resources.each do |resource|
|
|
30
|
+
updater.update_resource(resource, categories)
|
|
42
31
|
end
|
|
43
32
|
end
|
|
44
33
|
|
|
@@ -47,47 +36,20 @@ module TxghServer
|
|
|
47
36
|
|
|
48
37
|
private
|
|
49
38
|
|
|
50
|
-
def tag_resources_for(tx_resources)
|
|
51
|
-
payload['head_commit']['modified'].each_with_object(Set.new) do |modified, ret|
|
|
52
|
-
logger.info("processing modified file: #{modified}")
|
|
53
|
-
|
|
54
|
-
if tx_resources.include?(modified)
|
|
55
|
-
ret << tx_resources[modified]
|
|
56
|
-
end
|
|
57
|
-
end
|
|
58
|
-
end
|
|
59
|
-
|
|
60
|
-
def l10n_resources_for(tx_resources)
|
|
61
|
-
payload['head_commit']['modified'].each_with_object(Set.new) do |modified, ret|
|
|
62
|
-
if tx_resources.include?(modified)
|
|
63
|
-
logger.info("setting new resource: #{tx_resources[modified].L10N_resource_slug}")
|
|
64
|
-
ret << tx_resources[modified]
|
|
65
|
-
end
|
|
66
|
-
end
|
|
67
|
-
end
|
|
68
|
-
|
|
69
39
|
# finds the resources that were updated in each commit
|
|
70
|
-
def
|
|
71
|
-
|
|
72
|
-
logger.info(
|
|
40
|
+
def added_and_modified_resources
|
|
41
|
+
attributes.files.each_with_object(Set.new) do |file, ret|
|
|
42
|
+
logger.info("processing added/modified file: #{file}")
|
|
73
43
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
if tx_resources.include?(file)
|
|
78
|
-
ret << tx_resources[file]
|
|
79
|
-
end
|
|
44
|
+
if tx_resources.include?(file)
|
|
45
|
+
ret << tx_resources[file]
|
|
80
46
|
end
|
|
81
47
|
end
|
|
82
48
|
end
|
|
83
49
|
|
|
84
50
|
# Build an index of known Tx resources, by source file
|
|
85
|
-
def
|
|
86
|
-
tx_config.resources.each_with_object({}) do |resource, ret|
|
|
87
|
-
logger.info('processing resource')
|
|
88
|
-
|
|
89
|
-
# If we're processing by branch, create a branch resource. Otherwise,
|
|
90
|
-
# use the original resource.
|
|
51
|
+
def tx_resources
|
|
52
|
+
@tx_resources ||= tx_config.resources.each_with_object({}) do |resource, ret|
|
|
91
53
|
ret[resource.source_file] = if repo.process_all_branches?
|
|
92
54
|
Txgh::TxBranchResource.new(resource, branch) # maybe find instead?
|
|
93
55
|
else
|
|
@@ -101,7 +63,7 @@ module TxghServer
|
|
|
101
63
|
end
|
|
102
64
|
|
|
103
65
|
def branch
|
|
104
|
-
@ref ||=
|
|
66
|
+
@ref ||= attributes.ref.sub(/^refs\//, '')
|
|
105
67
|
end
|
|
106
68
|
|
|
107
69
|
def should_process?
|
|
@@ -115,7 +77,7 @@ module TxghServer
|
|
|
115
77
|
def should_process_commit?
|
|
116
78
|
# return false if 'after' commit sha is all zeroes (indicates branch
|
|
117
79
|
# has been deleted)
|
|
118
|
-
!(
|
|
80
|
+
!((attributes.after || '') =~ /\A0+\z/)
|
|
119
81
|
end
|
|
120
82
|
|
|
121
83
|
end
|
|
@@ -4,48 +4,14 @@ module TxghServer
|
|
|
4
4
|
module Webhooks
|
|
5
5
|
module Github
|
|
6
6
|
class RequestHandler
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
include ResponseHelpers
|
|
7
|
+
include ResponseHelpers
|
|
10
8
|
|
|
9
|
+
class << self
|
|
11
10
|
def handle_request(request, logger)
|
|
12
|
-
|
|
13
|
-
when 'push'
|
|
14
|
-
handle_push(request, logger)
|
|
15
|
-
when 'delete'
|
|
16
|
-
handle_delete(request, logger)
|
|
17
|
-
when 'ping'
|
|
18
|
-
handle_ping(request, logger)
|
|
19
|
-
else
|
|
20
|
-
handle_unexpected
|
|
21
|
-
end
|
|
11
|
+
new(request, logger).handle_request
|
|
22
12
|
end
|
|
23
|
-
|
|
24
|
-
private
|
|
25
|
-
|
|
26
|
-
def handle_push(request, logger)
|
|
27
|
-
klass = TxghServer::Webhooks::Github::PushHandler
|
|
28
|
-
new(request, logger).handle(klass)
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
def handle_delete(request, logger)
|
|
32
|
-
klass = TxghServer::Webhooks::Github::DeleteHandler
|
|
33
|
-
new(request, logger).handle(klass)
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
def handle_ping(request, logger)
|
|
37
|
-
klass = TxghServer::Webhooks::Github::PingHandler
|
|
38
|
-
new(request, logger).handle(klass)
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
def handle_unexpected
|
|
42
|
-
respond_with_error(400, 'Unexpected event type')
|
|
43
|
-
end
|
|
44
|
-
|
|
45
13
|
end
|
|
46
14
|
|
|
47
|
-
include ResponseHelpers
|
|
48
|
-
|
|
49
15
|
attr_reader :request, :logger
|
|
50
16
|
|
|
51
17
|
def initialize(request, logger)
|
|
@@ -53,16 +19,18 @@ module TxghServer
|
|
|
53
19
|
@logger = logger
|
|
54
20
|
end
|
|
55
21
|
|
|
56
|
-
def
|
|
22
|
+
def handle_request
|
|
57
23
|
handle_safely do
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
24
|
+
case request.env['HTTP_X_GITHUB_EVENT']
|
|
25
|
+
when 'push'
|
|
26
|
+
handle_push
|
|
27
|
+
when 'delete'
|
|
28
|
+
handle_delete
|
|
29
|
+
when 'ping'
|
|
30
|
+
handle_ping
|
|
31
|
+
else
|
|
32
|
+
handle_unexpected
|
|
33
|
+
end
|
|
66
34
|
end
|
|
67
35
|
end
|
|
68
36
|
|
|
@@ -78,16 +46,38 @@ module TxghServer
|
|
|
78
46
|
respond_with_error(500, "Internal server error: #{e.message}", e)
|
|
79
47
|
end
|
|
80
48
|
|
|
49
|
+
def handle_push
|
|
50
|
+
attributes = PushAttributes.from_webhook_payload(payload)
|
|
51
|
+
PushHandler.new(project, repo, logger, attributes).execute
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def handle_delete
|
|
55
|
+
attributes = DeleteAttributes.from_webhook_payload(payload)
|
|
56
|
+
DeleteHandler.new(project, repo, logger, attributes).execute
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def handle_ping
|
|
60
|
+
PingHandler.new(logger).execute
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def handle_unexpected
|
|
64
|
+
respond_with_error(400, 'Unexpected event type')
|
|
65
|
+
end
|
|
66
|
+
|
|
81
67
|
def payload
|
|
82
|
-
@payload ||=
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
68
|
+
@payload ||= begin
|
|
69
|
+
if request.params[:payload]
|
|
70
|
+
JSON.parse(request.params[:payload])
|
|
71
|
+
else
|
|
72
|
+
JSON.parse(request.body.read)
|
|
73
|
+
end
|
|
74
|
+
rescue JSON::ParserError
|
|
75
|
+
{}
|
|
86
76
|
end
|
|
87
77
|
end
|
|
88
78
|
|
|
89
79
|
def github_repo_name
|
|
90
|
-
payload
|
|
80
|
+
payload.fetch('repository', {})['full_name']
|
|
91
81
|
end
|
|
92
82
|
|
|
93
83
|
def config
|
|
@@ -98,6 +88,10 @@ module TxghServer
|
|
|
98
88
|
config.github_repo
|
|
99
89
|
end
|
|
100
90
|
|
|
91
|
+
def project
|
|
92
|
+
config.transifex_project
|
|
93
|
+
end
|
|
94
|
+
|
|
101
95
|
def authentic_request?
|
|
102
96
|
if repo.webhook_protected?
|
|
103
97
|
GithubRequestAuth.authentic_request?(
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
module TxghServer
|
|
2
2
|
module Webhooks
|
|
3
3
|
module Github
|
|
4
|
-
autoload :
|
|
5
|
-
autoload :
|
|
6
|
-
autoload :
|
|
7
|
-
autoload :
|
|
8
|
-
autoload :
|
|
4
|
+
autoload :DeleteAttributes, 'txgh-server/webhooks/github/delete_attributes'
|
|
5
|
+
autoload :DeleteHandler, 'txgh-server/webhooks/github/delete_handler'
|
|
6
|
+
autoload :Handler, 'txgh-server/webhooks/github/handler'
|
|
7
|
+
autoload :PingHandler, 'txgh-server/webhooks/github/ping_handler'
|
|
8
|
+
autoload :PushHandler, 'txgh-server/webhooks/github/push_handler'
|
|
9
|
+
autoload :PushAttributes, 'txgh-server/webhooks/github/push_attributes'
|
|
10
|
+
autoload :RequestHandler, 'txgh-server/webhooks/github/request_handler'
|
|
9
11
|
end
|
|
10
12
|
end
|
|
11
13
|
end
|
data/spec/application_spec.rb
CHANGED
|
@@ -185,9 +185,9 @@ describe TxghServer::WebhookEndpoints do
|
|
|
185
185
|
|
|
186
186
|
before(:each) do
|
|
187
187
|
allow(TxghServer::Webhooks::Github::PushHandler).to(
|
|
188
|
-
receive(:new) do |
|
|
189
|
-
expect(
|
|
190
|
-
expect(
|
|
188
|
+
receive(:new) do |project, repo, logger, attributes|
|
|
189
|
+
expect(project.name).to eq(project_name)
|
|
190
|
+
expect(repo.name).to eq(repo_name)
|
|
191
191
|
handler
|
|
192
192
|
end
|
|
193
193
|
)
|
|
@@ -199,6 +199,7 @@ describe TxghServer::WebhookEndpoints do
|
|
|
199
199
|
)
|
|
200
200
|
|
|
201
201
|
payload = GithubPayloadBuilder.push_payload(repo_name, ref)
|
|
202
|
+
payload.add_commit
|
|
202
203
|
|
|
203
204
|
sign_with payload.to_json
|
|
204
205
|
header 'X-GitHub-Event', 'push'
|
|
@@ -217,8 +218,11 @@ describe TxghServer::WebhookEndpoints do
|
|
|
217
218
|
end
|
|
218
219
|
|
|
219
220
|
it 'returns invalid request if event unrecognized' do
|
|
221
|
+
payload = GithubPayloadBuilder.push_payload(repo_name, ref)
|
|
222
|
+
|
|
223
|
+
sign_with payload.to_json
|
|
220
224
|
header 'X-GitHub-Event', 'foobar'
|
|
221
|
-
post '/github'
|
|
225
|
+
post '/github', payload.to_json
|
|
222
226
|
|
|
223
227
|
expect(last_response.status).to eq(400)
|
|
224
228
|
end
|
|
@@ -8,7 +8,7 @@ require 'helpers/integration_setup'
|
|
|
8
8
|
require 'uri'
|
|
9
9
|
require 'yaml'
|
|
10
10
|
|
|
11
|
-
include
|
|
11
|
+
include TxghServer
|
|
12
12
|
|
|
13
13
|
describe 'hook integration tests', integration: true do
|
|
14
14
|
include Rack::Test::Methods
|
|
@@ -83,10 +83,6 @@ describe 'hook integration tests', integration: true do
|
|
|
83
83
|
File.read(payload_path.join('github_postbody_release.json'))
|
|
84
84
|
end
|
|
85
85
|
|
|
86
|
-
let(:github_postbody_l10n) do
|
|
87
|
-
File.read(payload_path.join('github_postbody_l10n.json'))
|
|
88
|
-
end
|
|
89
|
-
|
|
90
86
|
let(:project_name) { 'test-project-88' }
|
|
91
87
|
let(:repo_name) { 'txgh-bot/txgh-test-resources' }
|
|
92
88
|
|
|
@@ -146,14 +142,4 @@ describe 'hook integration tests', integration: true do
|
|
|
146
142
|
expect(last_response).to be_ok
|
|
147
143
|
end
|
|
148
144
|
end
|
|
149
|
-
|
|
150
|
-
it 'verifies the github l10n hook endpoint works' do
|
|
151
|
-
VCR.use_cassette('github_l10n_hook_endpoint') do
|
|
152
|
-
sign_github_request(github_postbody_l10n)
|
|
153
|
-
header 'X-GitHub-Event', 'push'
|
|
154
|
-
header 'content-type', 'application/x-www-form-urlencoded'
|
|
155
|
-
post '/github', github_postbody_l10n
|
|
156
|
-
expect(last_response).to be_ok
|
|
157
|
-
end
|
|
158
|
-
end
|
|
159
145
|
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'helpers/github_payload_builder'
|
|
3
|
+
|
|
4
|
+
include TxghServer
|
|
5
|
+
include TxghServer::Webhooks::Github
|
|
6
|
+
|
|
7
|
+
describe DeleteAttributes do
|
|
8
|
+
let(:repo_name) { 'my_repo' }
|
|
9
|
+
let(:ref) { 'heads/my_ref' }
|
|
10
|
+
|
|
11
|
+
let(:payload) do
|
|
12
|
+
GithubPayloadBuilder.delete_payload(repo_name, ref)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
describe '#from_webhook_payload' do
|
|
16
|
+
let(:attributes) { DeleteAttributes.from_webhook_payload(payload.to_h) }
|
|
17
|
+
|
|
18
|
+
it 'pulls out repo name' do
|
|
19
|
+
expect(attributes.repo_name).to eq(repo_name)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
it 'pulls out ref' do
|
|
23
|
+
expect(attributes.ref).to eq("refs/#{ref}")
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
it 'pulls out ref type' do
|
|
27
|
+
expect(attributes.ref_type).to eq('branch')
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -9,12 +9,11 @@ describe DeleteHandler do
|
|
|
9
9
|
include StandardTxghSetup
|
|
10
10
|
|
|
11
11
|
let(:handler) do
|
|
12
|
-
DeleteHandler.new(
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
)
|
|
12
|
+
DeleteHandler.new(transifex_project, github_repo, logger, attributes)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
let(:attributes) do
|
|
16
|
+
DeleteAttributes.from_webhook_payload(payload.to_h)
|
|
18
17
|
end
|
|
19
18
|
|
|
20
19
|
let(:payload) do
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
require 'spec_helper'
|
|
2
|
+
require 'helpers/nil_logger'
|
|
2
3
|
|
|
3
4
|
include TxghServer
|
|
4
5
|
include TxghServer::Webhooks::Github
|
|
5
6
|
|
|
6
7
|
describe PingHandler do
|
|
7
8
|
let(:handler) do
|
|
8
|
-
PingHandler.new
|
|
9
|
+
PingHandler.new(NilLogger.new)
|
|
9
10
|
end
|
|
10
11
|
|
|
11
12
|
it 'responds with a 200 success' do
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'helpers/github_payload_builder'
|
|
3
|
+
|
|
4
|
+
include TxghServer
|
|
5
|
+
include TxghServer::Webhooks::Github
|
|
6
|
+
|
|
7
|
+
describe PushAttributes do
|
|
8
|
+
let(:repo_name) { 'my_repo' }
|
|
9
|
+
let(:ref) { 'heads/my_ref' }
|
|
10
|
+
let(:added) { ['added_file.txt'] }
|
|
11
|
+
let(:modified) { ['modified_file.txt'] }
|
|
12
|
+
|
|
13
|
+
let(:payload) do
|
|
14
|
+
GithubPayloadBuilder.push_payload(repo_name, ref).tap do |payload|
|
|
15
|
+
payload.add_commit(added: added, modified: modified)
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
describe '#from_webhook_payload' do
|
|
20
|
+
let(:attributes) { PushAttributes.from_webhook_payload(payload.to_h) }
|
|
21
|
+
|
|
22
|
+
it 'pulls out repo name' do
|
|
23
|
+
expect(attributes.repo_name).to eq(repo_name)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
it 'pulls out ref' do
|
|
27
|
+
expect(attributes.ref).to eq("refs/#{ref}")
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
it 'pulls out before sha' do
|
|
31
|
+
expect(attributes.before).to eq(payload.to_h['before'])
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
it 'pulls out after sha' do
|
|
35
|
+
expect(attributes.after).to eq(payload.to_h['after'])
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
it 'pulls out added files' do
|
|
39
|
+
expect(attributes.added_files.to_a).to eq(added)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
it 'pulls out modified files' do
|
|
43
|
+
expect(attributes.modified_files.to_a).to eq(modified)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
it 'combines all files into one handy array' do
|
|
47
|
+
expect(attributes.files.sort).to eq((added + modified).sort)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
it 'pulls out the author' do
|
|
51
|
+
expect(attributes.author).to eq('Test User')
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|