From 0ddf825ddf7bc480004919762b187390d0b900e9 Mon Sep 17 00:00:00 2001 From: James Lopez Date: Mon, 14 Nov 2016 18:05:13 +0100 Subject: [PATCH] WIP - adding a generic entity serializer that should accept a Hash coming from Arel --- app/serializers/analytics_generic_entity.rb | 32 +++++++++++++++ .../analytics_generic_serializer.rb | 3 ++ .../analytics_generic_entity_spec.rb | 39 +++++++++++++++++++ .../analytics_generic_serializer_spec.rb | 24 ++++++++++++ 4 files changed, 98 insertions(+) create mode 100644 app/serializers/analytics_generic_entity.rb create mode 100644 app/serializers/analytics_generic_serializer.rb create mode 100644 spec/serializers/analytics_generic_entity_spec.rb create mode 100644 spec/serializers/analytics_generic_serializer_spec.rb diff --git a/app/serializers/analytics_generic_entity.rb b/app/serializers/analytics_generic_entity.rb new file mode 100644 index 00000000000..b007d9056d0 --- /dev/null +++ b/app/serializers/analytics_generic_entity.rb @@ -0,0 +1,32 @@ +class AnalyticsGenericEntity < Grape::Entity + include RequestAwareEntity + include ActionView::Helpers::DateHelper + + + expose :title + expose :iid + expose :started_at, as: :date + expose :author, using: UserEntity + + expose :total_time do |object| + distance_of_time_in_words(object[:total_time].to_f) + end + + expose(:date) do |object| + interval_in_words(object[:created_at]) + end + + expose :url do |object| + url_to("namespace_project_#{object[:entity]}".to_sym, id: object[:iid].to_s) + end + + private + + def url_to(route, id = nil) + public_send("#{route}_url", options[:project].namespace, options[:project], id) + end + + def interval_in_words(diff) + "#{distance_of_time_in_words(diff.to_f)} ago" + end +end diff --git a/app/serializers/analytics_generic_serializer.rb b/app/serializers/analytics_generic_serializer.rb new file mode 100644 index 00000000000..2347b56a1d6 --- /dev/null +++ b/app/serializers/analytics_generic_serializer.rb @@ -0,0 +1,3 @@ +class AnalyticsGenericSerializer < BaseSerializer + entity AnalyticsGenericEntity +end diff --git a/spec/serializers/analytics_generic_entity_spec.rb b/spec/serializers/analytics_generic_entity_spec.rb new file mode 100644 index 00000000000..a09dae4520c --- /dev/null +++ b/spec/serializers/analytics_generic_entity_spec.rb @@ -0,0 +1,39 @@ +require 'spec_helper' + +describe AnalyticsGenericEntity do + let(:user) { create(:user) } + let(:entity_hash) { + { + total_time: "172802.724419", + title: "Eos voluptatem inventore in sed.", + iid: "1", + id: "1", + created_at: "2016-11-12 15:04:02.948604", + author: user, + entity: :merge_request + } + } + + let(:project) { create(:empty_project) } + + let(:entity) do + described_class.new(entity_hash, request: double, project: project) + end + + context 'generic entity' do + subject { entity.as_json } + + it 'contains the entity URL' do + expect(subject).to include(:url) + end + + it 'contains the author' do + expect(subject).to include(:author) + end + + it 'does not contain sensitive information' do + expect(subject).not_to include(/token/) + expect(subject).not_to include(/variables/) + end + end +end diff --git a/spec/serializers/analytics_generic_serializer_spec.rb b/spec/serializers/analytics_generic_serializer_spec.rb new file mode 100644 index 00000000000..24fd94810d4 --- /dev/null +++ b/spec/serializers/analytics_generic_serializer_spec.rb @@ -0,0 +1,24 @@ +require 'spec_helper' + +describe AnalyticsBuildSerializer do + let(:serializer) do + described_class + .new(project: project) + .represent(resource) + end + + let(:json) { serializer.as_json } + let(:project) { create(:project) } + let(:resource) { create(:ci_build) } + + context 'when there is a single object provided' do + it 'it generates payload for single object' do + expect(json).to be_an_instance_of Hash + end + + it 'contains important elements of analyticsBuild' do + expect(json) + .to include(:name, :branch, :short_sha, :date, :total_time, :url, :branch_url, :commit_url, :author) + end + end +end