blender-asset-tracer/tests/test_shaman_transfer.py
2021-07-22 10:14:43 +02:00

103 lines
4.0 KiB
Python

# ***** BEGIN GPL LICENSE BLOCK *****
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
# ***** END GPL LICENCE BLOCK *****
#
# (c) 2019, Blender Foundation - Sybren A. Stüvel
import pathlib
import platform
import responses
from tests.abstract_test import AbstractBlendFileTest
from blender_asset_tracer.pack.shaman import transfer
httpmock = responses.RequestsMock()
class ShamanTransferTest(AbstractBlendFileTest):
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.test_file1 = cls.blendfiles / "linked_cube_compressed.blend"
cls.test_file2 = cls.blendfiles / "basic_file.blend"
cls.expected_checksums = {
cls.test_file1: "3c525e3a01ece11f26ded1e05e43284c4cce575c8074b97c6bdbc414fa2802ab",
cls.test_file2: "d5283988d95f259069d4cd3c25a40526090534b8d188577b6c6fb36c3d481454",
}
cls.file_sizes = {
cls.test_file1: cls.test_file1.stat().st_size,
cls.test_file2: cls.test_file2.stat().st_size,
}
cls.packed_names = {
cls.test_file1: pathlib.PurePosixPath("path/in/pack/test1.blend"),
cls.test_file2: pathlib.PurePosixPath("path/in/pack/test2.blend"),
}
def assertValidCheckoutDef(self, definition_file: bytes):
# We don't care much about the order, so compare as set.
expect_lines = set()
for filepath in [self.test_file1, self.test_file2]:
checksum = self.expected_checksums[filepath]
fsize = self.file_sizes[filepath]
relpath = str(self.packed_names[filepath])
expect_lines.add(b"%s %d %s" % (checksum.encode(), fsize, relpath.encode()))
self.assertEqual(expect_lines, set(definition_file.split(b"\n")))
@httpmock.activate
def test_checkout_happy(self):
checksum1 = self.expected_checksums[self.test_file1]
fsize1 = self.file_sizes[self.test_file1]
def mock_requirements(request):
self.assertEqual("text/plain", request.headers["Content-Type"])
self.assertValidCheckoutDef(request.body)
body = "file-unknown path/in/pack/test1.blend\n"
return 200, {"Content-Type": "text/plain"}, body
def mock_checkout_create(request):
self.assertEqual("text/plain", request.headers["Content-Type"])
self.assertValidCheckoutDef(request.body)
return 200, {"Content-Type": "text/plain"}, "DA/-JOB-ID"
httpmock.add_callback(
"POST",
"http://unittest.local:1234/checkout/requirements",
callback=mock_requirements,
)
httpmock.add(
"POST", "http://unittest.local:1234/files/%s/%d" % (checksum1, fsize1)
)
httpmock.add_callback(
"POST",
"http://unittest.local:1234/checkout/create/DA-JOB-ID",
callback=mock_checkout_create,
)
trans = transfer.ShamanTransferrer(
"auth-token", self.blendfiles, "http://unittest.local:1234/", "DA-JOB-ID"
)
trans.start()
trans.queue_copy(self.test_file1, self.packed_names[self.test_file1])
trans.queue_copy(self.test_file2, self.packed_names[self.test_file2])
trans.done_and_join()
self.assertFalse(trans.has_error, trans.error_message())
self.assertEqual("DA/-JOB-ID", trans.checkout_location)