Commit 74f51877 authored by Andreas Brandl's avatar Andreas Brandl

Merge branch '246619-add-package-events' into 'master'

Adds package event tracking

Closes #246619

See merge request gitlab-org/gitlab!41846
parents 2e13a126 54651f01
......@@ -2,6 +2,8 @@
module Groups
module Registry
class RepositoriesController < Groups::ApplicationController
include PackagesHelper
before_action :verify_container_registry_enabled!
before_action :authorize_read_container_image!
......@@ -13,7 +15,7 @@ module Groups
.execute
.with_api_entity_associations
track_event(:list_repositories)
track_package_event(:list_repositories, :container)
serializer = ContainerRepositoriesSerializer
.new(current_user: current_user)
......
......@@ -3,6 +3,8 @@
module Projects
module Registry
class RepositoriesController < ::Projects::Registry::ApplicationController
include PackagesHelper
before_action :authorize_update_container_image!, only: [:destroy]
before_action :ensure_root_container_repository!, only: [:index]
......@@ -13,7 +15,7 @@ module Projects
@images = ContainerRepositoriesFinder.new(user: current_user, subject: project, params: params.slice(:name))
.execute
track_event(:list_repositories)
track_package_event(:list_repositories, :container)
serializer = ContainerRepositoriesSerializer
.new(project: project, current_user: current_user)
......@@ -31,7 +33,7 @@ module Projects
def destroy
image.delete_scheduled!
DeleteContainerRepositoryWorker.perform_async(current_user.id, image.id) # rubocop:disable CodeReuse/Worker
track_event(:delete_repository)
track_package_event(:delete_repository, :container)
respond_to do |format|
format.json { head :no_content }
......
......@@ -3,12 +3,15 @@
module Projects
module Registry
class TagsController < ::Projects::Registry::ApplicationController
include PackagesHelper
before_action :authorize_destroy_container_image!, only: [:destroy]
LIMIT = 15
def index
track_event(:list_tags)
track_package_event(:list_tags, :tag)
respond_to do |format|
format.json do
render json: ContainerTagsSerializer
......@@ -23,7 +26,7 @@ module Projects
result = Projects::ContainerRepository::DeleteTagsService
.new(image.project, current_user, tags: [params[:id]])
.execute(image)
track_event(:delete_tag)
track_package_event(:delete_tag, :tag)
respond_to do |format|
format.json { head(result[:status] == :success ? :ok : bad_request) }
......@@ -40,7 +43,7 @@ module Projects
result = Projects::ContainerRepository::DeleteTagsService
.new(image.project, current_user, tags: tag_names)
.execute(image)
track_event(:delete_tag_bulk)
track_package_event(:delete_tag_bulk, :tag)
respond_to do |format|
format.json { head(result[:status] == :success ? :no_content : :bad_request) }
......
......@@ -57,4 +57,9 @@ module PackagesHelper
package_help_url: help_page_path('user/packages/index')
}
end
def track_package_event(event_name, scope, **args)
::Packages::CreateEventService.new(nil, current_user, event_name: event_name, scope: scope).execute
track_event(event_name, **args)
end
end
# frozen_string_literal: true
class Packages::Event < ApplicationRecord
belongs_to :package, optional: true
# FIXME: Remove debian: 9 from here when it's added to the types in package.rb model
EVENT_SCOPES = ::Packages::Package.package_types.merge(debian: 9, container: 1000, tag: 1001).freeze
enum event_scope: EVENT_SCOPES
enum event_type: {
push_package: 0,
delete_package: 1,
pull_package: 2,
search_package: 3,
list_package: 4,
list_repositories: 5,
delete_repository: 6,
delete_tag: 7,
delete_tag_bulk: 8,
list_tags: 9,
cli_metadata: 10
}
enum originator_type: { user: 0, deploy_token: 1, guest: 2 }
end
# frozen_string_literal: true
module Packages
class CreateEventService < BaseService
def execute
event_scope = scope.is_a?(::Packages::Package) ? scope.package_type : scope
::Packages::Event.create!(
event_type: event_name,
originator: current_user&.id,
originator_type: originator_type,
event_scope: event_scope
)
end
private
def scope
params[:scope]
end
def event_name
params[:event_name]
end
def originator_type
case current_user
when User
:user
when DeployToken
:deploy_token
else
:guest
end
end
end
end
---
title: Adds package event tracking
merge_request: 41846
author:
type: added
# frozen_string_literal: true
class CreatePackageEvents < ActiveRecord::Migration[6.0]
include Gitlab::Database::MigrationHelpers
DOWNTIME = false
def change
create_table :packages_events do |t|
t.integer :event_type, null: false, limit: 2
t.integer :event_scope, null: false, limit: 2
t.integer :originator_type, null: false, limit: 2
t.bigint :originator
t.datetime_with_timezone :created_at, null: false
t.references :package, primary_key: false, default: nil, index: true, foreign_key: { to_table: :packages_packages, on_delete: :nullify }, type: :bigint
end
end
end
f68d29be164299e5ccf73347841d27b17f028941e37e3510d3da9d513762a17f
\ No newline at end of file
......@@ -14071,6 +14071,25 @@ CREATE SEQUENCE packages_dependency_links_id_seq
ALTER SEQUENCE packages_dependency_links_id_seq OWNED BY packages_dependency_links.id;
CREATE TABLE packages_events (
id bigint NOT NULL,
event_type smallint NOT NULL,
event_scope smallint NOT NULL,
originator_type smallint NOT NULL,
originator bigint,
created_at timestamp with time zone NOT NULL,
package_id bigint
);
CREATE SEQUENCE packages_events_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER SEQUENCE packages_events_id_seq OWNED BY packages_events.id;
CREATE TABLE packages_maven_metadata (
id bigint NOT NULL,
package_id bigint NOT NULL,
......@@ -17540,6 +17559,8 @@ ALTER TABLE ONLY packages_dependencies ALTER COLUMN id SET DEFAULT nextval('pack
ALTER TABLE ONLY packages_dependency_links ALTER COLUMN id SET DEFAULT nextval('packages_dependency_links_id_seq'::regclass);
ALTER TABLE ONLY packages_events ALTER COLUMN id SET DEFAULT nextval('packages_events_id_seq'::regclass);
ALTER TABLE ONLY packages_maven_metadata ALTER COLUMN id SET DEFAULT nextval('packages_maven_metadata_id_seq'::regclass);
ALTER TABLE ONLY packages_package_files ALTER COLUMN id SET DEFAULT nextval('packages_package_files_id_seq'::regclass);
......@@ -18735,6 +18756,9 @@ ALTER TABLE ONLY packages_dependencies
ALTER TABLE ONLY packages_dependency_links
ADD CONSTRAINT packages_dependency_links_pkey PRIMARY KEY (id);
ALTER TABLE ONLY packages_events
ADD CONSTRAINT packages_events_pkey PRIMARY KEY (id);
ALTER TABLE ONLY packages_maven_metadata
ADD CONSTRAINT packages_maven_metadata_pkey PRIMARY KEY (id);
......@@ -20727,6 +20751,8 @@ CREATE UNIQUE INDEX index_packages_dependencies_on_name_and_version_pattern ON p
CREATE INDEX index_packages_dependency_links_on_dependency_id ON packages_dependency_links USING btree (dependency_id);
CREATE INDEX index_packages_events_on_package_id ON packages_events USING btree (package_id);
CREATE INDEX index_packages_maven_metadata_on_package_id_and_path ON packages_maven_metadata USING btree (package_id, path);
CREATE INDEX index_packages_nuget_dl_metadata_on_dependency_link_id ON packages_nuget_dependency_link_metadata USING btree (dependency_link_id);
......@@ -23512,6 +23538,9 @@ ALTER TABLE ONLY merge_request_user_mentions
ALTER TABLE ONLY ci_job_artifacts
ADD CONSTRAINT fk_rails_c5137cb2c1 FOREIGN KEY (job_id) REFERENCES ci_builds(id) ON DELETE CASCADE;
ALTER TABLE ONLY packages_events
ADD CONSTRAINT fk_rails_c6c20d0094 FOREIGN KEY (package_id) REFERENCES packages_packages(id) ON DELETE SET NULL;
ALTER TABLE ONLY project_settings
ADD CONSTRAINT fk_rails_c6df6e6328 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
......
......@@ -123,7 +123,7 @@ module API
bad_request!
end
package_event('push_package')
track_package_event('push_package', :composer)
::Packages::Composer::CreatePackageService
.new(authorized_user_project, current_user, declared_params)
......
......@@ -246,7 +246,7 @@ module API
delete do
authorize!(:destroy_package, project)
package_event('delete_package', category: 'API::ConanPackages')
track_package_event('delete_package', :conan, category: 'API::ConanPackages')
package.destroy
end
......
......@@ -31,7 +31,7 @@ module API
authorize_upload!(authorized_user_project)
bad_request!('File is too large') if authorized_user_project.actual_limits.exceeded?(:debian_max_file_size, params[:file].size)
package_event('push_package')
track_package_event('push_package', :debian)
created!
rescue ObjectStorage::RemoteStoreError => e
......
......@@ -4,6 +4,8 @@ module API
class GroupContainerRepositories < Grape::API::Instance
include PaginationParams
helpers ::API::Helpers::PackagesHelpers
before { authorize_read_group_container_images! }
REPOSITORY_ENDPOINT_REQUIREMENTS = API::NAMESPACE_OR_PROJECT_REQUIREMENTS.merge(
......@@ -27,7 +29,7 @@ module API
user: current_user, subject: user_group
).execute
track_event('list_repositories')
track_package_event('list_repositories', :container)
present paginate(repositories), with: Entities::ContainerRegistry::Repository, tags: params[:tags], tags_count: params[:tags_count]
end
......
......@@ -158,7 +158,7 @@ module API
conan_package_reference: params[:conan_package_reference]
).execute!
package_event('pull_package', category: 'API::ConanPackages') if params[:file_name] == ::Packages::Conan::FileMetadatum::PACKAGE_BINARY
track_package_event('pull_package', :conan, category: 'API::ConanPackages') if params[:file_name] == ::Packages::Conan::FileMetadatum::PACKAGE_BINARY
present_carrierwave_file!(package_file.file)
end
......@@ -169,7 +169,7 @@ module API
def track_push_package_event
if params[:file_name] == ::Packages::Conan::FileMetadatum::PACKAGE_BINARY && params[:file].size > 0 # rubocop: disable Style/ZeroLengthPredicate
package_event('push_package', category: 'API::ConanPackages')
track_package_event('push_package', :conan, category: 'API::ConanPackages')
end
end
......
......@@ -48,7 +48,8 @@ module API
require_gitlab_workhorse!
end
def package_event(event_name, **args)
def track_package_event(event_name, scope, **args)
::Packages::CreateEventService.new(nil, current_user, event_name: event_name, scope: scope).execute
track_event(event_name, **args)
end
end
......
......@@ -107,7 +107,7 @@ module API
when 'sha1'
package_file.file_sha1
else
package_event('pull_package') if jar_file?(format)
track_package_event('pull_package', :maven) if jar_file?(format)
present_carrierwave_file_with_head_support!(package_file.file)
end
end
......@@ -145,7 +145,7 @@ module API
when 'sha1'
package_file.file_sha1
else
package_event('pull_package') if jar_file?(format)
track_package_event('pull_package', :maven) if jar_file?(format)
present_carrierwave_file_with_head_support!(package_file.file)
end
......@@ -181,7 +181,7 @@ module API
when 'sha1'
package_file.file_sha1
else
package_event('pull_package') if jar_file?(format)
track_package_event('pull_package', :maven) if jar_file?(format)
present_carrierwave_file_with_head_support!(package_file.file)
end
......@@ -233,7 +233,7 @@ module API
when 'md5'
nil
else
package_event('push_package') if jar_file?(format)
track_package_event('push_package', :maven) if jar_file?(format)
file_params = {
file: params[:file],
......
......@@ -141,7 +141,7 @@ module API
package_file = ::Packages::PackageFileFinder
.new(package, params[:file_name]).execute!
package_event('pull_package')
track_package_event('pull_package', package)
present_carrierwave_file!(package_file.file)
end
......@@ -157,7 +157,7 @@ module API
put ':id/packages/npm/:package_name', requirements: NPM_ENDPOINT_REQUIREMENTS do
authorize_create_package!(user_project)
package_event('push_package')
track_package_event('push_package', :npm)
created_package = ::Packages::Npm::CreatePackageService
.new(user_project, current_user, params.merge(build: current_authenticated_job)).execute
......
......@@ -73,7 +73,7 @@ module API
get 'index', format: :json do
authorize_read_package!(authorized_user_project)
track_event('nuget_service_index')
track_package_event('cli_metadata', :nuget)
present ::Packages::Nuget::ServiceIndexPresenter.new(authorized_user_project),
with: ::API::Entities::Nuget::ServiceIndex
......@@ -105,7 +105,7 @@ module API
package_file = ::Packages::CreatePackageFileService.new(package, file_params)
.execute
package_event('push_package')
track_package_event('push_package', :nuget)
::Packages::Nuget::ExtractionWorker.perform_async(package_file.id) # rubocop:disable CodeReuse/Worker
......@@ -198,7 +198,7 @@ module API
not_found!('Package') unless package_file
package_event('pull_package')
track_package_event('pull_package', :nuget)
# nuget and dotnet don't support 302 Moved status codes, supports_direct_download has to be set to false
present_carrierwave_file!(package_file.file, supports_direct_download: false)
......@@ -233,7 +233,7 @@ module API
.new(authorized_user_project, params[:q], search_options)
.execute
package_event('search_package')
track_package_event('search_package', :nuget)
present ::Packages::Nuget::SearchResultsPresenter.new(search),
with: ::API::Entities::Nuget::SearchResults
......
......@@ -3,6 +3,7 @@
module API
class ProjectContainerRepositories < Grape::API::Instance
include PaginationParams
helpers ::API::Helpers::PackagesHelpers
REPOSITORY_ENDPOINT_REQUIREMENTS = API::NAMESPACE_OR_PROJECT_REQUIREMENTS.merge(
tag_name: API::NO_SLASH_URL_PART_REGEX)
......@@ -28,7 +29,7 @@ module API
user: current_user, subject: user_project
).execute
track_event( 'list_repositories')
track_package_event('list_repositories', :container)
present paginate(repositories), with: Entities::ContainerRegistry::Repository, tags: params[:tags], tags_count: params[:tags_count]
end
......@@ -43,7 +44,7 @@ module API
authorize_admin_container_image!
DeleteContainerRepositoryWorker.perform_async(current_user.id, repository.id) # rubocop:disable CodeReuse/Worker
track_event('delete_repository')
track_package_event('delete_repository', :container)
status :accepted
end
......@@ -60,7 +61,7 @@ module API
authorize_read_container_image!
tags = Kaminari.paginate_array(repository.tags)
track_event('list_tags')
track_package_event('list_tags', :container)
present paginate(tags), with: Entities::ContainerRegistry::Tag
end
......@@ -89,7 +90,7 @@ module API
declared_params.except(:repository_id).merge(container_expiration_policy: false))
# rubocop:enable CodeReuse/Worker
track_event('delete_tag_bulk')
track_package_event('delete_tag_bulk', :container)
status :accepted
end
......@@ -125,7 +126,7 @@ module API
.execute(repository)
if result[:status] == :success
track_event('delete_tag')
track_package_event('delete_tag', :container)
status :ok
else
......
......@@ -72,7 +72,7 @@ module API
package = packages_finder(project).by_file_name_and_sha256(filename, params[:sha256])
package_file = ::Packages::PackageFileFinder.new(package, filename, with_file_name_like: false).execute
package_event('pull_package')
track_package_event('pull_package', :pypi)
present_carrierwave_file!(package_file.file, supports_direct_download: true)
end
......@@ -91,7 +91,7 @@ module API
get 'simple/*package_name', format: :txt do
authorize_read_package!(authorized_user_project)
package_event('list_package')
track_package_event('list_package', :pypi)
packages = find_package_versions
presenter = ::Packages::Pypi::PackagePresenter.new(packages, authorized_user_project)
......@@ -122,7 +122,7 @@ module API
authorize_upload!(authorized_user_project)
bad_request!('File is too large') if authorized_user_project.actual_limits.exceeded?(:pypi_max_file_size, params[:content].size)
package_event('push_package')
track_package_event('push_package', :pypi)
::Packages::Pypi::CreatePackageService
.new(authorized_user_project, current_user, declared_params)
......
......@@ -87,7 +87,7 @@ RSpec.describe Groups::Registry::RepositoriesController do
it_behaves_like 'with name parameter'
it_behaves_like 'a gitlab tracking event', described_class.name, 'list_repositories'
it_behaves_like 'a package tracking event', described_class.name, 'list_repositories'
context 'with project in subgroup' do
let_it_be(:test_group) { create(:group, parent: group ) }
......
......@@ -109,7 +109,7 @@ RSpec.describe Projects::Registry::TagsController do
it 'tracks the event' do
expect_delete_tags(%w[test.])
expect(controller).to receive(:track_event).with(:delete_tag)
expect(controller).to receive(:track_event).with(:delete_tag, {})
destroy_tag('test.')
end
......
......@@ -44,7 +44,7 @@ RSpec.describe API::GroupContainerRepositories do
let(:object) { group }
end
it_behaves_like 'a gitlab tracking event', described_class.name, 'list_repositories'
it_behaves_like 'a package tracking event', described_class.name, 'list_repositories'
context 'with invalid group id' do
let(:url) { "/groups/#{non_existing_record_id}/registry/repositories" }
......
......@@ -36,7 +36,7 @@ RSpec.describe API::MavenPackages do
context 'with jar file' do
let_it_be(:package_file) { jar_file }
it_behaves_like 'a gitlab tracking event', described_class.name, 'pull_package'
it_behaves_like 'a package tracking event', described_class.name, 'pull_package'
end
end
......@@ -571,7 +571,7 @@ RSpec.describe API::MavenPackages do
context 'event tracking' do
subject { upload_file_with_token(params) }
it_behaves_like 'a gitlab tracking event', described_class.name, 'push_package'
it_behaves_like 'a package tracking event', described_class.name, 'push_package'
end
it 'creates package and stores package file' do
......
......@@ -197,7 +197,7 @@ RSpec.describe API::NpmPackages do
expect(response.media_type).to eq('application/octet-stream')
end
it_behaves_like 'a gitlab tracking event', described_class.name, 'pull_package'
it_behaves_like 'a package tracking event', described_class.name, 'pull_package'
end
context 'private project' do
......@@ -305,7 +305,7 @@ RSpec.describe API::NpmPackages do
context 'with access token' do
subject { upload_package_with_token(package_name, params) }
it_behaves_like 'a gitlab tracking event', described_class.name, 'push_package'
it_behaves_like 'a package tracking event', described_class.name, 'push_package'
it 'creates npm package with file' do
expect { subject }
......
......@@ -45,7 +45,7 @@ RSpec.describe API::ProjectContainerRepositories do
it_behaves_like 'rejected container repository access', :guest, :forbidden
it_behaves_like 'rejected container repository access', :anonymous, :not_found
it_behaves_like 'a gitlab tracking event', described_class.name, 'list_repositories'
it_behaves_like 'a package tracking event', described_class.name, 'list_repositories'
it_behaves_like 'returns repositories for allowed users', :reporter, 'project' do
let(:object) { project }
......@@ -57,7 +57,7 @@ RSpec.describe API::ProjectContainerRepositories do
it_behaves_like 'rejected container repository access', :developer, :forbidden
it_behaves_like 'rejected container repository access', :anonymous, :not_found
it_behaves_like 'a gitlab tracking event', described_class.name, 'delete_repository'
it_behaves_like 'a package tracking event', described_class.name, 'delete_repository'
context 'for maintainer' do
let(:api_user) { maintainer }
......@@ -86,7 +86,7 @@ RSpec.describe API::ProjectContainerRepositories do
stub_container_registry_tags(repository: root_repository.path, tags: %w(rootA latest))
end
it_behaves_like 'a gitlab tracking event', described_class.name, 'list_tags'
it_behaves_like 'a package tracking event', described_class.name, 'list_tags'
it 'returns a list of tags' do
subject
......@@ -114,7 +114,7 @@ RSpec.describe API::ProjectContainerRepositories do
it_behaves_like 'rejected container repository access', :developer, :forbidden
it_behaves_like 'rejected container repository access', :anonymous, :not_found
it_behaves_like 'a gitlab tracking event', described_class.name, 'delete_tag_bulk'
it_behaves_like 'a package tracking event', described_class.name, 'delete_tag_bulk'
end
context 'for maintainer' do
......
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe Packages::CreateEventService do
let(:scope) { 'container' }
let(:event_name) { 'push_package' }
let(:params) do
{
scope: scope,
event_name: event_name
}
end
subject { described_class.new(nil, user, params).execute }
describe '#execute' do
shared_examples 'package event creation' do |originator_type, expected_scope|
it 'creates the event' do
expect { subject }.to change { Packages::Event.count }.by(1)
expect(subject.originator_type).to eq(originator_type)
expect(subject.originator).to eq(user&.id)
expect(subject.event_scope).to eq(expected_scope)
expect(subject.event_type).to eq(event_name)
end
end
context 'with a user' do
let(:user) { create(:user) }
it_behaves_like 'package event creation', 'user', 'container'
end
context 'with a deploy token' do
let(:user) { create(:deploy_token) }
it_behaves_like 'package event creation', 'deploy_token', 'container'
end
context 'with no user' do
let(:user) { nil }
it_behaves_like 'package event creation', 'guest', 'container'
end
context 'with a package as scope' do
let(:user) { nil }
let(:scope) { create(:npm_package) }
it_behaves_like 'package event creation', 'guest', 'npm'
end
end
end
......@@ -75,7 +75,7 @@ RSpec.shared_examples 'Composer package creation' do |user_type, status, add_mem
expect(response).to have_gitlab_http_status(status)
end
it_behaves_like 'a gitlab tracking event', described_class.name, 'push_package'
it_behaves_like 'a package tracking event', described_class.name, 'push_package'
end
end
......
......@@ -79,11 +79,3 @@ RSpec.shared_examples 'returns repositories for allowed users' do |user_type, sc
end
end
end
RSpec.shared_examples 'a gitlab tracking event' do |category, action|
it "creates a gitlab tracking event #{action}" do
expect(Gitlab::Tracking).to receive(:event).with(category, action, {})
subject
end
end
......@@ -128,7 +128,7 @@ RSpec.shared_examples 'Debian project repository PUT request' do |user_role, add
expect(response.body).to eq(body)
end
end
it_behaves_like 'a gitlab tracking event', described_class.name, 'push_package'
it_behaves_like 'a package tracking event', described_class.name, 'push_package'
else
it "returns #{status}#{and_body}" do
subject
......
......@@ -26,7 +26,7 @@ RSpec.shared_examples 'process nuget service index request' do |user_type, statu
it_behaves_like 'returning response status', status
it_behaves_like 'a gitlab tracking event', described_class.name, 'nuget_service_index'
it_behaves_like 'a package tracking event', described_class.name, 'cli_metadata'
it 'returns a valid json response' do
subject
......@@ -169,7 +169,7 @@ RSpec.shared_examples 'process nuget upload' do |user_type, status, add_member =
context 'with correct params' do
it_behaves_like 'package workhorse uploads'
it_behaves_like 'creates nuget package files'
it_behaves_like 'a gitlab tracking event', described_class.name, 'push_package'
it_behaves_like 'a package tracking event', described_class.name, 'push_package'
end
end
......@@ -286,7 +286,7 @@ RSpec.shared_examples 'process nuget download content request' do |user_type, st
it_behaves_like 'returning response status', status
it_behaves_like 'a gitlab tracking event', described_class.name, 'pull_package'
it_behaves_like 'a package tracking event', described_class.name, 'pull_package'
it 'returns a valid package archive' do
subject
......@@ -336,7 +336,7 @@ RSpec.shared_examples 'process nuget search request' do |user_type, status, add_
it_behaves_like 'returns a valid json search response', status, 4, [1, 5, 5, 1]
it_behaves_like 'a gitlab tracking event', described_class.name, 'search_package'
it_behaves_like 'a package tracking event', described_class.name, 'search_package'
context 'with skip set to 2' do
let(:skip) { 2 }
......
......@@ -126,3 +126,11 @@ RSpec.shared_examples 'job token for package uploads' do
end
end
end
RSpec.shared_examples 'a package tracking event' do |category, action|
it "creates a gitlab tracking event #{action}" do
expect(Gitlab::Tracking).to receive(:event).with(category, action, {})
expect { subject }.to change { Packages::Event.count }.by(1)
end
end
......@@ -52,7 +52,7 @@ RSpec.shared_examples 'PyPi package creation' do |user_type, status, add_member
context 'with correct params' do
it_behaves_like 'package workhorse uploads'
it_behaves_like 'creating pypi package files'
it_behaves_like 'a gitlab tracking event', described_class.name, 'push_package'
it_behaves_like 'a package tracking event', described_class.name, 'push_package'
end
end
......@@ -119,7 +119,7 @@ RSpec.shared_examples 'PyPi package versions' do |user_type, status, add_member
end
it_behaves_like 'returning response status', status
it_behaves_like 'a gitlab tracking event', described_class.name, 'list_package'
it_behaves_like 'a package tracking event', described_class.name, 'list_package'
end
end
......@@ -136,7 +136,7 @@ RSpec.shared_examples 'PyPi package download' do |user_type, status, add_member
end
it_behaves_like 'returning response status', status
it_behaves_like 'a gitlab tracking event', described_class.name, 'pull_package'
it_behaves_like 'a package tracking event', described_class.name, 'pull_package'
end
end
......
# frozen_string_literal: true
RSpec.shared_examples 'a gitlab tracking event' do |category, action|
it "creates a gitlab tracking event #{action}" do
expect(Gitlab::Tracking).to receive(:event).with(category, action, {})
subject
end
end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment