kopia lustrzana https://dev.funkwhale.audio/funkwhale/funkwhale
194 wiersze
5.6 KiB
Python
194 wiersze
5.6 KiB
Python
import json
|
|
import os
|
|
import pytest
|
|
|
|
from funkwhale_api.music import models
|
|
from funkwhale_api.music import licenses
|
|
|
|
|
|
@pytest.fixture
|
|
def purge_license_cache():
|
|
licenses._cache = None
|
|
yield
|
|
licenses._cache = None
|
|
|
|
|
|
def test_licenses_do_not_change():
|
|
"""
|
|
We have 100s of licenses static data, and we want to ensure
|
|
that this data do not change without notice.
|
|
So we generate a json file based on this data,
|
|
and ensure our python data match our JSON file.
|
|
"""
|
|
path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "licenses.json")
|
|
from_python = licenses.LICENSES
|
|
if os.path.exists(path):
|
|
with open(path) as f:
|
|
from_file = json.loads(f.read())
|
|
assert from_file == from_python
|
|
else:
|
|
# we write the file
|
|
with open(path, "w") as f:
|
|
f.write(json.dumps(from_python, indent=4))
|
|
|
|
|
|
def test_load_licenses_create(db):
|
|
license_data = {
|
|
"code": "dummy",
|
|
"url": "http://dummy",
|
|
"redistribute": True,
|
|
"derivative": True,
|
|
"commercial": True,
|
|
"attribution": True,
|
|
"copyleft": True,
|
|
}
|
|
licenses.load([license_data])
|
|
|
|
license = models.License.objects.get(pk=license_data["code"])
|
|
|
|
assert license.url == license_data["url"]
|
|
assert license.redistribute == license_data["redistribute"]
|
|
assert license.derivative == license_data["derivative"]
|
|
assert license.copyleft == license_data["copyleft"]
|
|
assert license.commercial == license_data["commercial"]
|
|
assert license.attribution == license_data["attribution"]
|
|
|
|
|
|
def test_load_hardcoded_licenses_works(db):
|
|
licenses.load(licenses.LICENSES)
|
|
|
|
|
|
def test_license_data():
|
|
for data in licenses.LICENSES:
|
|
assert data["identifiers"][0].startswith("http") is True
|
|
required_fields = [
|
|
"code",
|
|
"name",
|
|
"url",
|
|
"derivative",
|
|
"commercial",
|
|
"redistribute",
|
|
"attribution",
|
|
]
|
|
for field in required_fields:
|
|
assert field in required_fields
|
|
|
|
|
|
def test_load_licenses_update(factories):
|
|
license = models.License.objects.create(
|
|
code="dummy",
|
|
url="http://oldurl",
|
|
redistribute=True,
|
|
derivative=True,
|
|
commercial=True,
|
|
attribution=True,
|
|
copyleft=True,
|
|
)
|
|
license_data = {
|
|
"code": "dummy",
|
|
"url": "http://newurl",
|
|
"redistribute": False,
|
|
"derivative": False,
|
|
"commercial": True,
|
|
"attribution": True,
|
|
"copyleft": True,
|
|
}
|
|
licenses.load([license_data])
|
|
|
|
license.refresh_from_db()
|
|
|
|
assert license.url == license_data["url"]
|
|
assert license.derivative == license_data["derivative"]
|
|
assert license.copyleft == license_data["copyleft"]
|
|
assert license.commercial == license_data["commercial"]
|
|
assert license.attribution == license_data["attribution"]
|
|
|
|
|
|
def test_load_skip_update_if_no_change(factories, mocker):
|
|
license = models.License.objects.create(
|
|
code="dummy",
|
|
url="http://oldurl",
|
|
redistribute=True,
|
|
derivative=True,
|
|
commercial=True,
|
|
attribution=True,
|
|
copyleft=True,
|
|
)
|
|
update_or_create = mocker.patch.object(models.License.objects, "update_or_create")
|
|
save = mocker.patch.object(models.License, "save")
|
|
|
|
# we load licenses but with same data
|
|
licenses.load(
|
|
[
|
|
{
|
|
"code": "dummy",
|
|
"url": license.url,
|
|
"derivative": license.derivative,
|
|
"redistribute": license.redistribute,
|
|
"commercial": license.commercial,
|
|
"attribution": license.attribution,
|
|
"copyleft": license.copyleft,
|
|
}
|
|
]
|
|
)
|
|
|
|
save.assert_not_called()
|
|
update_or_create.assert_not_called()
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
"value, expected",
|
|
[
|
|
(["http://creativecommons.org/licenses/by-sa/4.0/"], "cc-by-sa-4.0"),
|
|
(["https://creativecommons.org/licenses/by-sa/4.0/"], "cc-by-sa-4.0"),
|
|
(["https://creativecommons.org/licenses/by-sa/4.0"], "cc-by-sa-4.0"),
|
|
(
|
|
[
|
|
"License for this work is: http://creativecommons.org/licenses/by-sa/4.0/"
|
|
],
|
|
"cc-by-sa-4.0",
|
|
),
|
|
(
|
|
[
|
|
"License: http://creativecommons.org/licenses/by-sa/4.0/ not http://creativecommons.org/publicdomain/zero/1.0/" # noqa
|
|
],
|
|
"cc-by-sa-4.0",
|
|
),
|
|
(
|
|
[None, "Copyright 2018 http://creativecommons.org/licenses/by-sa/4.0/"],
|
|
"cc-by-sa-4.0",
|
|
),
|
|
(
|
|
[
|
|
"Unknown",
|
|
"Copyright 2018 http://creativecommons.org/licenses/by-sa/4.0/",
|
|
],
|
|
"cc-by-sa-4.0",
|
|
),
|
|
(["Unknown"], None),
|
|
([""], None),
|
|
],
|
|
)
|
|
def test_match(value, expected, db, mocker, purge_license_cache):
|
|
load = mocker.spy(licenses, "load")
|
|
result = licenses.match(*value)
|
|
|
|
if expected:
|
|
assert result == models.License.objects.get(code=expected)
|
|
load.assert_called_once_with(licenses.LICENSES)
|
|
else:
|
|
assert result is None
|
|
|
|
|
|
def test_match_cache(mocker, db, purge_license_cache):
|
|
assert licenses._cache is None
|
|
licenses.match("http://test.com")
|
|
|
|
assert licenses._cache == sorted(models.License.objects.all(), key=lambda o: o.code)
|
|
|
|
load = mocker.patch.object(licenses, "load")
|
|
assert licenses.match(
|
|
"http://creativecommons.org/licenses/by-sa/4.0/"
|
|
) == models.License.objects.get(code="cc-by-sa-4.0")
|
|
load.assert_not_called()
|