From 60cdd2bcc894cf9cce4892570bf6a146dc45e536 Mon Sep 17 00:00:00 2001
From: Grzegorz Bizon <grzesiek.bizon@gmail.com>
Date: Fri, 31 Mar 2017 12:27:05 +0200
Subject: [PATCH] Add specs for container repository factory method

---
 app/models/container_repository.rb            |  2 +-
 ...ntainer_registry_authentication_service.rb |  2 +-
 spec/models/container_repository_spec.rb      | 51 ++++++++++++++++---
 3 files changed, 45 insertions(+), 10 deletions(-)

diff --git a/app/models/container_repository.rb b/app/models/container_repository.rb
index 052d93c3bdc..e27369c10d6 100644
--- a/app/models/container_repository.rb
+++ b/app/models/container_repository.rb
@@ -58,7 +58,7 @@ class ContainerRepository < ActiveRecord::Base
     end
   end
 
-  def self.create_from_path(path)
+  def self.create_from_path!(path)
     self.create(project: path.repository_project,
                 name: path.repository_name)
   end
diff --git a/app/services/auth/container_registry_authentication_service.rb b/app/services/auth/container_registry_authentication_service.rb
index dcb728b6151..d58ff589be1 100644
--- a/app/services/auth/container_registry_authentication_service.rb
+++ b/app/services/auth/container_registry_authentication_service.rb
@@ -94,7 +94,7 @@ module Auth
       return if path.has_repository?
       return unless actions.include?('push')
 
-      ContainerRepository.create_from_path(path)
+      ContainerRepository.create_from_path!(path)
     end
 
     def can_access?(requested_project, requested_action)
diff --git a/spec/models/container_repository_spec.rb b/spec/models/container_repository_spec.rb
index 92dccf76d71..884eac43719 100644
--- a/spec/models/container_repository_spec.rb
+++ b/spec/models/container_repository_spec.rb
@@ -85,28 +85,63 @@ describe ContainerRepository do
     end
   end
 
-  describe '#from_repository_path' do
+  describe '.create_from_path!' do
+    let(:repository) do
+      described_class.create_from_path!(ContainerRegistry::Path.new(path))
+    end
+
+    let(:repository_path) { ContainerRegistry::Path.new(path) }
+
     context 'when received multi-level repository path' do
-      let(:repository) do
-        described_class.from_repository_path('group/test/some/image/name')
-      end
+      let(:path) { project.full_path + '/some/image' }
 
-      pending 'fabricates object within a correct project' do
+      it 'fabricates repository assigned to a correct project' do
         expect(repository.project).to eq project
       end
 
-      pending 'it fabricates project with a correct name' do
-        expect(repository.name).to eq 'some/image/name'
+      it 'fabricates repository with a correct name' do
+        expect(repository.name).to eq 'some/image'
       end
     end
 
-    context 'when path contains too many nodes' do
+    context 'when path is too long' do
+      let(:path) do
+        project.full_path + '/a/b/c/d/e/f/g/h/i/j/k/l/n/o/p/s/t/u/x/y/z'
+      end
+
+      it 'does not create repository and raises error' do
+        expect { repository }.to raise_error(
+          ContainerRegistry::Path::InvalidRegistryPathError)
+      end
     end
 
     context 'when received multi-level repository with nested groups' do
+      let(:group) { create(:group, :nested, name: 'nested') }
+      let(:path) { project.full_path + '/some/image' }
+
+      it 'fabricates repository assigned to a correct project' do
+        expect(repository.project).to eq project
+      end
+
+      it 'fabricates repository with a correct name' do
+        expect(repository.name).to eq 'some/image'
+      end
+
+      it 'has path including a nested group' do
+        expect(repository.path).to include 'nested/test/some/image'
+      end
     end
 
     context 'when received root repository path' do
+      let(:path) { project.full_path }
+
+      it 'fabricates repository assigned to a correct project' do
+        expect(repository.project).to eq project
+      end
+
+      it 'fabricates repository with an empty name' do
+        expect(repository.name).to be_empty
+      end
     end
   end
 end
-- 
GitLab