diff --git a/app/tests.py b/app/tests.py
index 97cfd3813635b6f038e275c3cf3e9c5e4aabd5f0..49096574e4684a161bcac4e8641571ba50db887d 100644
--- a/app/tests.py
+++ b/app/tests.py
@@ -1,3 +1,5 @@
+import mock
+import pandas as pd
 import base64
 import datetime as dt
 import json
@@ -9,7 +11,7 @@ import time
 import itertools
 from django.test import override_settings
 from datetime import datetime
-from io import StringIO
+from io import StringIO, BytesIO
 from time import sleep
 
 import mock
@@ -25,8 +27,8 @@ from django.contrib import messages as dj_messages
 from django.contrib.auth import get_user_model
 from django.core import mail, serializers
 from django.core.exceptions import PermissionDenied, ValidationError
+from django.core.files.uploadedfile import SimpleUploadedFile, InMemoryUploadedFile
 from django.core.files import File
-from django.core.files.uploadedfile import SimpleUploadedFile
 from django.core.management import call_command
 from django.db.utils import IntegrityError
 from pytz import timezone, UTC
@@ -1326,7 +1328,6 @@ class UploadPageTest(TestCase):
         # Negative tests
         self.assertNotContains(response, "anything")
 
-
 class UploadExcelPageTest(TestCase):
     def setUp(self):
         self.client = Client()
@@ -3153,9 +3154,6 @@ class YTUrlVideoTest(TestCase):
     
     @override_settings(MEDIA_ROOT=tempfile.gettempdir())
     def setUpImage(self):
-        from io import BytesIO
-
-        from django.core.files.uploadedfile import InMemoryUploadedFile
         self.cover = InMemoryUploadedFile(
             BytesIO(base64.b64decode(TEST_IMAGE)),
             field_name='tempfile',
@@ -3948,3 +3946,43 @@ class MateriStatsTest(TestCase):
         response = self.client.get(self.path_json)
         jobj = json.loads(response.content)
         self.assertEqual(len(jobj['labels']), 6)
+
+
+class UploadMateriTest(TestCase):
+    def setUp(self):
+        self.client = Client()
+        self.user = User.objects._create_user(email="kontributor@gov.id",
+                                              password="kontributor", is_contributor=True)
+        self.setUpImage()
+        self.content = SimpleUploadedFile("ExampleFile221.pdf", b"Test file")
+        self.category = Category.objects.create(id="1", name="sains", description="kategori sains")
+        
+    
+    @override_settings(MEDIA_ROOT=tempfile.gettempdir())
+    def setUpImage(self):
+        self.cover = InMemoryUploadedFile(
+            BytesIO(base64.b64decode(TEST_IMAGE)),
+            field_name='tempfile',
+            name='tempfile.png',
+            content_type='image/png',
+            size=len(TEST_IMAGE),
+            charset='utf-8',
+        )
+
+    def test_for_invalid_input_shows_validation_error(self):
+        self.client.login(email="kontributor@gov.id",
+                          password="kontributor")
+        response = self.client.post("/unggah/", data={"title": ""})
+        self.assertContains(response, "This field is required.")
+
+    def test_data_form_upload_materi_success_save_to_db(self):
+        self.client.login(email="kontributor@gov.id",
+                          password="kontributor")
+
+        data = {"title":"Dunia Binatang", "author":"Parzival", "publisher":"Buku Asyik", 
+                "release_year":"2015", "descriptions":"Buku dunia binatang seri 1",
+                'categories':"1", "cover":self.cover, "content":self.content}
+        
+        self.client.post("/unggah/", data=data)
+
+        self.assertEqual(Materi.objects.count(), 1)
\ No newline at end of file