diff --git a/lib/gitlab/ci/badge/coverage/template.rb b/lib/gitlab/ci/badge/coverage/template.rb
index 7589fa5ff8bbd92315ef43f08d33f102272ff9f4..96702420e9dc29aa3cb71e6a93b4d7c40b614d0f 100644
--- a/lib/gitlab/ci/badge/coverage/template.rb
+++ b/lib/gitlab/ci/badge/coverage/template.rb
@@ -24,26 +24,10 @@ def initialize(badge)
           @key_width = badge.customization.dig(:key_width)
         end
 
-        def key_text
-          if @key_text && @key_text.size <= MAX_KEY_TEXT_SIZE
-            @key_text
-          else
-            @entity.to_s
-          end
-        end
-
         def value_text
           @status ? ("%.2f%%" % @status) : 'unknown'
         end
 
-        def key_width
-          if @key_width && @key_width.between?(1, MAX_KEY_WIDTH)
-            @key_width
-          else
-            62
-          end
-        end
-
         def value_width
           @status ? 54 : 58
         end
diff --git a/lib/gitlab/ci/badge/pipeline/template.rb b/lib/gitlab/ci/badge/pipeline/template.rb
index 8430b01fc9a172075658211e7fd496b5aaf167a7..c39f96e4a3458160d922e2800b969eb6d8dff4aa 100644
--- a/lib/gitlab/ci/badge/pipeline/template.rb
+++ b/lib/gitlab/ci/badge/pipeline/template.rb
@@ -28,26 +28,10 @@ def initialize(badge)
           @key_width = badge.customization.dig(:key_width)
         end
 
-        def key_text
-          if @key_text && @key_text.size <= MAX_KEY_TEXT_SIZE
-            @key_text
-          else
-            @entity.to_s
-          end
-        end
-
         def value_text
           STATUS_RENAME[@status.to_s] || @status.to_s
         end
 
-        def key_width
-          if @key_width && @key_width.between?(1, MAX_KEY_WIDTH)
-            @key_width
-          else
-            62
-          end
-        end
-
         def value_width
           54
         end
diff --git a/lib/gitlab/ci/badge/template.rb b/lib/gitlab/ci/badge/template.rb
index 0580dad72baff380d40a5c12f8961a46d64f0c02..d514a8577bdae6d4893e1e57950e6c976f577b91 100644
--- a/lib/gitlab/ci/badge/template.rb
+++ b/lib/gitlab/ci/badge/template.rb
@@ -8,6 +8,7 @@ module Badge
     class Template
       MAX_KEY_TEXT_SIZE = 64
       MAX_KEY_WIDTH = 512
+      DEFAULT_KEY_WIDTH = 62
 
       def initialize(badge)
         @entity = badge.entity
@@ -15,7 +16,11 @@ def initialize(badge)
       end
 
       def key_text
-        raise NotImplementedError
+        if @key_text && @key_text.size <= MAX_KEY_TEXT_SIZE
+          @key_text
+        else
+          @entity.to_s
+        end
       end
 
       def value_text
@@ -23,7 +28,11 @@ def value_text
       end
 
       def key_width
-        raise NotImplementedError
+        if @key_width && @key_width.between?(1, MAX_KEY_WIDTH)
+          @key_width
+        else
+          DEFAULT_KEY_WIDTH
+        end
       end
 
       def value_width
diff --git a/spec/lib/gitlab/ci/badge/coverage/template_spec.rb b/spec/lib/gitlab/ci/badge/coverage/template_spec.rb
index f010d1bce50dfd5eba7d2206a1e6709359e7f316..b03ca3c93ca9209b7c77c03add5c0e510ce369e3 100644
--- a/spec/lib/gitlab/ci/badge/coverage/template_spec.rb
+++ b/spec/lib/gitlab/ci/badge/coverage/template_spec.rb
@@ -6,31 +6,7 @@
   let(:badge) { double(entity: 'coverage', status: 90.00, customization: {}) }
   let(:template) { described_class.new(badge) }
 
-  describe '#key_text' do
-    it 'says coverage by default' do
-      expect(template.key_text).to eq 'coverage'
-    end
-
-    context 'when custom key_text is defined' do
-      before do
-        allow(badge).to receive(:customization).and_return({ key_text: "custom text" })
-      end
-
-      it 'returns custom value' do
-        expect(template.key_text).to eq "custom text"
-      end
-
-      context 'when its size is larger than the max allowed value' do
-        before do
-          allow(badge).to receive(:customization).and_return({ key_text: 't' * 65 })
-        end
-
-        it 'returns default value' do
-          expect(template.key_text).to eq 'coverage'
-        end
-      end
-    end
-  end
+  it_behaves_like 'a badge template', 'coverage'
 
   describe '#value_text' do
     context 'when coverage is known' do
@@ -60,32 +36,6 @@
     end
   end
 
-  describe '#key_width' do
-    it 'is fixed by default' do
-      expect(template.key_width).to eq 62
-    end
-
-    context 'when custom key_width is defined' do
-      before do
-        allow(badge).to receive(:customization).and_return({ key_width: 101 })
-      end
-
-      it 'returns custom value' do
-        expect(template.key_width).to eq 101
-      end
-
-      context 'when it is larger than the max allowed value' do
-        before do
-          allow(badge).to receive(:customization).and_return({ key_width: 513 })
-        end
-
-        it 'returns default value' do
-          expect(template.key_width).to eq 62
-        end
-      end
-    end
-  end
-
   describe '#value_width' do
     context 'when coverage is known' do
       it 'is narrower when coverage is known' do
diff --git a/spec/lib/gitlab/ci/badge/pipeline/template_spec.rb b/spec/lib/gitlab/ci/badge/pipeline/template_spec.rb
index 696bb62b4d618b4b78cf7ea00561b227dc8669e4..9392ccef14702a3d3e432e2d5211aa292210e9eb 100644
--- a/spec/lib/gitlab/ci/badge/pipeline/template_spec.rb
+++ b/spec/lib/gitlab/ci/badge/pipeline/template_spec.rb
@@ -6,31 +6,7 @@
   let(:badge) { double(entity: 'pipeline', status: 'success', customization: {}) }
   let(:template) { described_class.new(badge) }
 
-  describe '#key_text' do
-    it 'says pipeline by default' do
-      expect(template.key_text).to eq 'pipeline'
-    end
-
-    context 'when custom key_text is defined' do
-      before do
-        allow(badge).to receive(:customization).and_return({ key_text: 'custom text' })
-      end
-
-      it 'returns custom value' do
-        expect(template.key_text).to eq 'custom text'
-      end
-
-      context 'when its size is larger than the max allowed value' do
-        before do
-          allow(badge).to receive(:customization).and_return({ key_text: 't' * 65 })
-        end
-
-        it 'returns default value' do
-          expect(template.key_text).to eq 'pipeline'
-        end
-      end
-    end
-  end
+  it_behaves_like 'a badge template', 'pipeline'
 
   describe '#value_text' do
     it 'is status value' do
@@ -38,32 +14,6 @@
     end
   end
 
-  describe '#key_width' do
-    it 'is fixed by default' do
-      expect(template.key_width).to eq 62
-    end
-
-    context 'when custom key_width is defined' do
-      before do
-        allow(badge).to receive(:customization).and_return({ key_width: 101 })
-      end
-
-      it 'returns custom value' do
-        expect(template.key_width).to eq 101
-      end
-
-      context 'when it is larger than the max allowed value' do
-        before do
-          allow(badge).to receive(:customization).and_return({ key_width: 513 })
-        end
-
-        it 'returns default value' do
-          expect(template.key_width).to eq 62
-        end
-      end
-    end
-  end
-
   describe 'widths and text anchors' do
     it 'has fixed width and text anchors' do
       expect(template.width).to eq 116
diff --git a/spec/support/shared_examples/ci/badge_template_shared_examples.rb b/spec/support/shared_examples/ci/badge_template_shared_examples.rb
new file mode 100644
index 0000000000000000000000000000000000000000..94aec33ecc21f6656d35558810a4e03d716fb787
--- /dev/null
+++ b/spec/support/shared_examples/ci/badge_template_shared_examples.rb
@@ -0,0 +1,57 @@
+# frozen_string_literal: true
+
+RSpec.shared_examples 'a badge template' do |badge_type|
+  describe '#key_text' do
+    it "says #{badge_type} by default" do
+      expect(template.key_text).to eq(badge_type)
+    end
+
+    context 'when custom key_text is defined' do
+      before do
+        allow(badge).to receive(:customization).and_return({ key_text: "custom text" })
+      end
+
+      it 'returns custom value' do
+        expect(template.key_text).to eq("custom text")
+      end
+
+      context 'when its size is larger than the max allowed value' do
+        before do
+          allow(badge).to receive(:customization).and_return({ key_text: 't' * (::Gitlab::Ci::Badge::Template::MAX_KEY_TEXT_SIZE + 1) } )
+        end
+
+        it 'returns default value' do
+          expect(template.key_text).to eq(badge_type)
+        end
+      end
+    end
+  end
+
+  describe '#key_width' do
+    let_it_be(:default_key_width) { ::Gitlab::Ci::Badge::Template::DEFAULT_KEY_WIDTH }
+
+    it 'is fixed by default' do
+      expect(template.key_width).to eq(default_key_width)
+    end
+
+    context 'when custom key_width is defined' do
+      before do
+        allow(badge).to receive(:customization).and_return({ key_width: 101 })
+      end
+
+      it 'returns custom value' do
+        expect(template.key_width).to eq(101)
+      end
+
+      context 'when it is larger than the max allowed value' do
+        before do
+          allow(badge).to receive(:customization).and_return({ key_width: ::Gitlab::Ci::Badge::Template::MAX_KEY_WIDTH + 1 })
+        end
+
+        it 'returns default value' do
+          expect(template.key_width).to eq(default_key_width)
+        end
+      end
+    end
+  end
+end