diff --git a/logs_collector/collector/tests.py b/logs_collector/collector/tests.py
deleted file mode 100644
index 7ce503c..0000000
--- a/logs_collector/collector/tests.py
+++ /dev/null
@@ -1,3 +0,0 @@
-from django.test import TestCase
-
-# Create your tests here.
diff --git a/logs_collector/collector/tests/__init__.py b/logs_collector/collector/tests/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/logs_collector/collector/tests/test_models.py b/logs_collector/collector/tests/test_models.py
new file mode 100644
index 0000000..0f000e8
--- /dev/null
+++ b/logs_collector/collector/tests/test_models.py
@@ -0,0 +1,58 @@
+from pathlib import Path
+from django.test import TestCase
+from django.contrib.auth.models import User
+from django.core.files.base import ContentFile
+from django.conf import settings
+
+from collector.models import Platform, Ticket, Archive
+
+
+def delete_test_files(ticket):
+    test_file = settings.MEDIA_ROOT_FOR_SENSITIVE_FILES / Path(str(ticket))
+    test_file.unlink(missing_ok=True)
+
+
+class TestModels(TestCase):
+
+    def setUp(self):
+        # create test user:
+        self.test_user = User.objects.create_user(
+            username='oops',
+            password='hG2wS231YPWmj3'
+        )
+        # create test platform and ticket:
+        self.test_platform = Platform.objects.create(
+            name='vm6',
+            pretty_name='VMmanager 6'
+        )
+        self.test_ticket = Ticket.objects.create(
+            number=1488228,
+            platform=self.test_platform,
+            user=self.test_user
+        )
+
+    def test_correct_platform_fields(self):
+        self.assertEqual(self.test_platform.name, 'vm6')
+        self.assertEqual(self.test_platform.pretty_name, 'VMmanager 6')
+
+    def test_correct_ticket_fields(self):
+        self.assertEqual(self.test_ticket.number, 1488228)
+        self.assertEqual(self.test_ticket.attempts, 5)
+        self.assertEqual(
+            self.test_ticket.platform.name,
+            self.test_platform.name
+        )
+
+    def test_correct_archive_fields(self):
+        test_archive = Archive.objects.create(
+            file=ContentFile(b'...', name='test.tar.gz'),
+            ticket=self.test_ticket
+        )
+        triple_dots_md5 = '2f43b42fd833d1e77420a8dae7419000'
+        self.assertEquals(test_archive.md5, triple_dots_md5)
+        self.assertEquals(
+            test_archive.file.name,
+            f'{self.test_ticket.number}/test.tar.gz'
+        )
+        # ? workaround delete test file:
+        delete_test_files(test_archive.file)
diff --git a/logs_collector/collector/tests/test_urls.py b/logs_collector/collector/tests/test_urls.py
new file mode 100644
index 0000000..dd2157a
--- /dev/null
+++ b/logs_collector/collector/tests/test_urls.py
@@ -0,0 +1,67 @@
+from django.test import TestCase
+from django.urls import resolve, reverse
+from django.contrib.auth.models import User
+
+from collector import views
+from collector.models import Ticket, Platform
+
+
+class TestUrls(TestCase):
+
+    def setUp(self):
+        # create test user:
+        self.test_user = User.objects.create_user(
+            username='oops',
+            password='hG2wS231YPWmj3'
+        )
+        # create test platform and ticket:
+        self.test_platform = Platform.objects.create(
+            name='dci6',
+            pretty_name='DCImanager 6'
+        )
+        self.test_ticket = Ticket.objects.create(
+            number=1488228,
+            platform=self.test_platform,
+            user=self.test_user
+        )
+
+    # CREATE:
+    def test_ticket_create_url_is_resolved(self):
+        url = reverse('collector:create')
+        self.assertEquals(resolve(url).func.view_class, views.CreateTicket)
+
+    # READ:
+    def test_index_page_url_is_resolved(self):
+        url = reverse('collector:index')
+        self.assertEquals(resolve(url).func.view_class, views.ListAllTickets)
+
+    def test_list_all_tickets_url_is_resolved(self):
+        url = reverse('collector:tickets')
+        self.assertEquals(resolve(url).func.view_class, views.ListAllTickets)
+
+    def test_list_platform_tickets_url_is_resolved(self):
+        url = reverse('collector:platform', args=[self.test_platform.name])
+        self.assertEquals(
+            resolve(url).func.view_class, views.ListPlatformTickets
+        )
+
+    def test_detail_ticket_url_is_resolved(self):
+        url = reverse(
+            'collector:ticket',
+            args=[self.test_platform.name, self.test_ticket.number]
+        )
+        self.assertEquals(resolve(url).func.view_class, views.DetailTicket)
+
+    def test_archives_download_url_is_resolved(self):
+        url = reverse('collector:download', args=['1488228/test.tar.gz'])
+        self.assertEquals(
+            resolve(url).func.view_class, views.ArchiveHandlerView
+        )
+
+    # UPDATE:
+    def test_update_ticket_url_is_resolved(self):
+        url = reverse(
+            'collector:update',
+            args=[self.test_platform.name, self.test_ticket.number]
+        )
+        self.assertEquals(resolve(url).func.view_class, views.UpdateTicket)
diff --git a/logs_collector/collector/tests/test_views.py b/logs_collector/collector/tests/test_views.py
new file mode 100644
index 0000000..bf7a278
--- /dev/null
+++ b/logs_collector/collector/tests/test_views.py
@@ -0,0 +1,131 @@
+from django.test import TestCase, Client
+from django.urls import reverse
+from django.contrib.auth.models import User
+
+from collector.models import Ticket, Platform
+
+
+class TestViews(TestCase):
+
+    def setUp(self):
+        # create test user:
+        self.test_user = User.objects.create_user(
+            username='oops',
+            password='hG2wS231YPWmj3'
+        )
+        # create test client:
+        self.client = Client()
+        self.client.login(username='oops', password='hG2wS231YPWmj3')
+        # create test platform and ticket:
+        self.test_platform = Platform.objects.create(
+            name='vm6',
+            pretty_name='VMmanager 6'
+        )
+        self.test_ticket = Ticket.objects.create(
+            number=1488228,
+            platform=self.test_platform,
+            user=self.test_user
+        )
+
+        # test urls:
+        # -- -- -- --
+
+        # CREATE:
+        self.ticket_create_url = reverse('collector:create')
+
+        # READ:
+        self.all_tickets_list = reverse('collector:tickets')
+        self.platform_tickets_list = reverse(
+            'collector:platform',
+            args=[self.test_platform.name]
+        )
+        self.ticket_detail_url = reverse(
+            'collector:ticket',
+            args=[self.test_platform.name, self.test_ticket.number]
+        )
+
+        # UPDATE:
+        self.ticket_update_url = reverse(
+            'collector:update',
+            args=[self.test_platform.name, self.test_ticket.number]
+        )
+
+    # CREATE:
+    def test_create_ticket_POST(self):
+        response = self.client.post(
+            self.ticket_create_url,
+            data={
+                'number': 1111,
+                'platform': self.test_platform.name,
+                'attempts': 5
+            }
+        )
+        self.assertEquals(response.status_code, 302)
+        self.assertEquals(Ticket.objects.get(number=1111).number, 1111)
+        self.assertEquals(Ticket.objects.get(number=1111).platform.name, 'vm6')
+        self.assertEquals(
+            Ticket.objects.get(
+                number=1111).platform.pretty_name, 'VMmanager 6'
+            )
+        self.assertEquals(
+            Ticket.objects.get(number=1111).user.username, 'oops'
+        )
+
+    # READ:
+    def test_all_ticket_list_GET(self):
+        response = self.client.get(self.all_tickets_list)
+        self.assertEquals(response.status_code, 200)
+        self.assertTemplateUsed(response, 'collector/tickets.html')
+        self.assertTemplateUsed(response, 'collector/base.html')
+        self.assertTemplateUsed(response, 'base.html')
+        self.assertTemplateUsed(response, 'includes/theme_switcher.html')
+        self.assertTemplateUsed(response, 'includes/navigation.html')
+        self.assertTemplateUsed(response, 'collector/includes/pagination.html')
+        self.assertTemplateUsed(
+            response,
+            'collector/includes/ticket_info.html'
+        )
+        self.assertTemplateUsed(
+            response,
+            'collector/includes/modal_ticket.html'
+        )
+
+    def test_platform_tickets_list_GET(self):
+        response = self.client.get(self.platform_tickets_list)
+        self.assertEquals(response.status_code, 200)
+        self.assertTemplateUsed(response, 'collector/tickets.html')
+
+    def test_ticket_detail_GET(self):
+        response = self.client.get(self.ticket_detail_url)
+        self.assertEquals(response.status_code, 200)
+        self.assertTemplateUsed(response, 'collector/ticket.html')
+        self.assertTemplateUsed(
+            response, 'collector/includes/ticket_info.html'
+        )
+        self.assertTemplateUsed(
+            response, 'collector/includes/modal_ticket.html'
+        )
+
+    def test_ticket_create_GET(self):
+        response = self.client.get(self.ticket_create_url)
+        self.assertEquals(response.status_code, 200)
+        self.assertTemplateUsed(response, 'collector/ticket_create.html')
+
+    def test_ticket_update_GET(self):
+        response = self.client.get(self.ticket_update_url)
+        self.assertEquals(response.status_code, 200)
+        self.assertTemplateUsed(response, 'collector/ticket_create.html')
+
+    # UPDATE:
+    def test_ticket_update_UPDATE(self):
+        response = self.client.post(
+            self.ticket_update_url,
+            data={
+                'number': 1488229,
+                'platform': self.test_platform.name,
+                'attempts': 3
+            }
+        )
+        self.assertEquals(response.status_code, 302)
+        self.assertEquals(Ticket.objects.get(number=1488229).number, 1488229)
+        self.assertEquals(Ticket.objects.get(number=1488229).attempts, 3)