diff options
author | Rémy Coutable <remy@rymai.me> | 2017-09-15 19:08:27 +0200 |
---|---|---|
committer | Rémy Coutable <remy@rymai.me> | 2017-10-09 15:07:10 +0200 |
commit | 67d5ca9f9220e5572f3fa6d0d8290cd7b802f02f (patch) | |
tree | d424fc71d20847c8a7c0314ff081f3d2ed9afbe4 /spec/support/shared_examples | |
parent | f277fa14094e5515e2317d2baa1fa0bfb95966da (diff) | |
download | gitlab-ce-67d5ca9f9220e5572f3fa6d0d8290cd7b802f02f.tar.gz |
Include the changes in issuable webhook payloads
Signed-off-by: Rémy Coutable <remy@rymai.me>
Diffstat (limited to 'spec/support/shared_examples')
-rw-r--r-- | spec/support/shared_examples/models/issuable_hook_data_shared_examples.rb | 58 | ||||
-rw-r--r-- | spec/support/shared_examples/models/project_hook_data_shared_examples.rb | 42 |
2 files changed, 100 insertions, 0 deletions
diff --git a/spec/support/shared_examples/models/issuable_hook_data_shared_examples.rb b/spec/support/shared_examples/models/issuable_hook_data_shared_examples.rb new file mode 100644 index 00000000000..ed1d2f41eae --- /dev/null +++ b/spec/support/shared_examples/models/issuable_hook_data_shared_examples.rb @@ -0,0 +1,58 @@ +# This shared example requires a `user` variable +shared_examples 'issuable hook data' do |kind| + let(:data) { issuable.to_hook_data(user) } + + include_examples 'project hook data' do + let(:project) { issuable.project } + end + include_examples 'deprecated repository hook data' + + context "with a #{kind}" do + it 'contains issuable data' do + expect(data[:object_kind]).to eq(kind) + expect(data[:user]).to eq(user.hook_attrs) + expect(data[:object_attributes]).to eq(issuable.hook_attrs) + expect(data[:changes]).to match(hash_including({ + 'author_id' => [nil, issuable.author_id], + 'cached_markdown_version' => [nil, issuable.cached_markdown_version], + 'created_at' => [nil, a_kind_of(ActiveSupport::TimeWithZone)], + 'description' => [nil, issuable.description], + 'description_html' => [nil, issuable.description_html], + 'id' => [nil, issuable.id], + 'iid' => [nil, issuable.iid], + 'state' => [nil, issuable.state], + 'title' => [nil, issuable.title], + 'title_html' => [nil, issuable.title_html], + 'updated_at' => [nil, a_kind_of(ActiveSupport::TimeWithZone)] + })) + expect(data).not_to have_key(:assignee) + end + + describe 'simple attributes are updated' do + before do + issuable.update(title: 'Hello World', description: 'A cool description') + end + + it 'includes an empty :changes hash' do + expect(data[:changes]).to match(hash_including({ + 'title' => [issuable.previous_changes['title'][0], 'Hello World'], + 'description' => [issuable.previous_changes['description'][0], 'A cool description'], + 'updated_at' => [a_kind_of(ActiveSupport::TimeWithZone), a_kind_of(ActiveSupport::TimeWithZone)] + })) + end + end + + context "#{kind} has labels" do + let(:labels) { [create(:label), create(:label)] } + + before do + issuable.update_attribute(:labels, labels) + end + + it 'includes labels in the hook data' do + expect(data[:labels]).to eq(labels.map(&:hook_attrs)) + expect(data[:changes]).to eq({ 'labels' => [[], labels.map(&:name)] }) + end + end + end +end diff --git a/spec/support/shared_examples/models/project_hook_data_shared_examples.rb b/spec/support/shared_examples/models/project_hook_data_shared_examples.rb new file mode 100644 index 00000000000..f0264878811 --- /dev/null +++ b/spec/support/shared_examples/models/project_hook_data_shared_examples.rb @@ -0,0 +1,42 @@ +shared_examples 'project hook data with deprecateds' do |project_key: :project| + it 'contains project data' do + expect(data[project_key][:name]).to eq(project.name) + expect(data[project_key][:description]).to eq(project.description) + expect(data[project_key][:web_url]).to eq(project.web_url) + expect(data[project_key][:avatar_url]).to eq(project.avatar_url) + expect(data[project_key][:git_http_url]).to eq(project.http_url_to_repo) + expect(data[project_key][:git_ssh_url]).to eq(project.ssh_url_to_repo) + expect(data[project_key][:namespace]).to eq(project.namespace.name) + expect(data[project_key][:visibility_level]).to eq(project.visibility_level) + expect(data[project_key][:path_with_namespace]).to eq(project.full_path) + expect(data[project_key][:default_branch]).to eq(project.default_branch) + expect(data[project_key][:homepage]).to eq(project.web_url) + expect(data[project_key][:url]).to eq(project.url_to_repo) + expect(data[project_key][:ssh_url]).to eq(project.ssh_url_to_repo) + expect(data[project_key][:http_url]).to eq(project.http_url_to_repo) + end +end + +shared_examples 'project hook data' do |project_key: :project| + it 'contains project data' do + expect(data[project_key][:name]).to eq(project.name) + expect(data[project_key][:description]).to eq(project.description) + expect(data[project_key][:web_url]).to eq(project.web_url) + expect(data[project_key][:avatar_url]).to eq(project.avatar_url) + expect(data[project_key][:git_http_url]).to eq(project.http_url_to_repo) + expect(data[project_key][:git_ssh_url]).to eq(project.ssh_url_to_repo) + expect(data[project_key][:namespace]).to eq(project.namespace.name) + expect(data[project_key][:visibility_level]).to eq(project.visibility_level) + expect(data[project_key][:path_with_namespace]).to eq(project.full_path) + expect(data[project_key][:default_branch]).to eq(project.default_branch) + end +end + +shared_examples 'deprecated repository hook data' do + it 'contains deprecated repository data' do + expect(data[:repository][:name]).to eq(project.name) + expect(data[:repository][:description]).to eq(project.description) + expect(data[:repository][:url]).to eq(project.url_to_repo) + expect(data[:repository][:homepage]).to eq(project.web_url) + end +end |