194 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			194 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			Python
		
	
	
	
import json
 | 
						|
import os
 | 
						|
 | 
						|
import pytest
 | 
						|
 | 
						|
from funkwhale_api.music import licenses, models
 | 
						|
 | 
						|
 | 
						|
@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()
 |