File: test_uri_validators.py

package info (click to toggle)
python-spdx-tools 0.8.3-5
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 5,084 kB
  • sloc: python: 18,675; xml: 12,553; sh: 46; makefile: 7
file content (137 lines) | stat: -rw-r--r-- 5,690 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
# SPDX-FileCopyrightText: 2022 spdx contributors
#
# SPDX-License-Identifier: Apache-2.0

import pytest

from spdx_tools.spdx.validation.uri_validators import validate_download_location, validate_uri, validate_url


@pytest.mark.parametrize(
    "input_value",
    [
        "https://some.url",
        "https://spdx.org/spdxdocs/spdx-tools-v1.2-3F2504E0-4F89-41D3-9A0C-0305E82...",
        "http://some.url",
        "http://ftp.gnu.org/gnu/glibc/glibc-ports-2.15.tar.gz",
    ],
)
def test_valid_url(input_value):
    assert validate_url(input_value) == []
    # URLs are also valid download locations:
    assert validate_download_location(input_value) == []


# TODO: more negative examples: https://github.com/spdx/tools-python/issues/377
@pytest.mark.parametrize("input_value", [":::::", "http://testurl"])
def test_invalid_url(input_value):
    assert validate_url(input_value) == [f"must be a valid URL, but is: {input_value}"]


@pytest.mark.parametrize(
    "input_value",
    [
        "http://ftp.gnu.org/gnu/glibc/glibc-ports-2.15.tar.gz",
        "git://git.myproject.org/MyProject",
        "git+https://git.myproject.org/MyProject.git",
        "git+http://git.myproject.org/MyProject",
        "git+ssh://git.myproject.org/MyProject.git",
        "git+ssh://git@git.myproject.org/MyProject.git",
        "git+git://git.myproject.org/MyProject",
        "git+git@git.myproject.org:MyProject",
        "git://git.myproject.org/MyProject#src/somefile.c",
        "git+https://git.myproject.org/MyProject#src/Class.java",
        "git://git.myproject.org/MyProject.git@master",
        "git+https://git.myproject.org/MyProject.git@v1.0",
        "git://git.myproject.org/MyProject.git@da39a3ee5e6b4b0d3255bfef95601890afd80709",
        "git+https://git.myproject.org/MyProject.git@master#/src/MyClass.cpp",
        "git+https://git.myproject.org/MyProject@da39a3ee5e6b4b0d3255bfef95601890afd80709#lib/variable.rb",
        "hg+http://hg.myproject.org/MyProject",
        "hg+https://hg.myproject.org/MyProject",
        "hg+ssh://hg.myproject.org/MyProject",
        "hg+https://hg.myproject.org/MyProject#src/somefile.c",
        "hg+https://hg.myproject.org/MyProject#src/Class.java",
        "hg+https://hg.myproject.org/MyProject@da39a3ee5e6b",
        "hg+https://hg.myproject.org/MyProject@2019",
        "hg+https://hg.myproject.org/MyProject@v1.0",
        "hg+https://hg.myproject.org/MyProject@special_feature",
        "hg+https://hg.myproject.org/MyProject@master#/src/MyClass.cpp",
        "hg+https://hg.myproject.org/MyProject@da39a3ee5e6b#lib/variable.rb",
        "svn://svn.myproject.org/svn/MyProject",
        "svn+svn://svn.myproject.org/svn/MyProject",
        "svn+http://svn.myproject.org/svn/MyProject/trunk",
        "svn+https://svn.myproject.org/svn/MyProject/trunk",
        "svn+https://svn.myproject.org/MyProject#src/somefile.c",
        "svn+https://svn.myproject.org/MyProject#src/Class.java",
        "svn+https://svn.myproject.org/MyProject/trunk#src/somefile.c",
        "svn+https://svn.myproject.org/MyProject/trunk/src/somefile.c",
        "svn+https://svn.myproject.org/svn/MyProject/trunk@2019",
        "svn+https://svn.myproject.org/MyProject@123#/src/MyClass.cpp",
        "svn+https://svn.myproject.org/MyProject/trunk@1234#lib/variable/variable.rb",
        "bzr+https://bzr.myproject.org/MyProject/trunk",
        "bzr+http://bzr.myproject.org/MyProject/trunk",
        "bzr+sftp://myproject.org/MyProject/trunk",
        "bzr+ssh://myproject.org/MyProject/trunk",
        "bzr+ftp://myproject.org/MyProject/trunk",
        "bzr+lp:MyProject",
        "bzr+https://bzr.myproject.org/MyProject/trunk#src/somefile.c",
        "bzr+https://bzr.myproject.org/MyProject/trunk#src/Class.java",
        "bzr+https://bzr.myproject.org/MyProject/trunk@2019",
        "bzr+http://bzr.myproject.org/MyProject/trunk@v1.0",
        "bzr+https://bzr.myproject.org/MyProject/trunk@2019#src/somefile.c",
    ],
)
def test_valid_package_download_location(input_value):
    assert validate_download_location(input_value) == []


# TODO: more negative examples: https://github.com/spdx/tools-python/issues/377
@pytest.mark.parametrize(
    "input_value",
    [
        ":::::",
    ],
)
def test_invalid_package_download_location(input_value):
    assert validate_download_location(input_value) == [
        f"must be a valid URL or download location according to the specification, but is: {input_value}"
    ]


@pytest.mark.parametrize(
    "input_value",
    [
        "https://some.uri",
        "http:////some",
        "https://spdx.org/spdxdocs/spdx-tools-v1.2-3F2504E0-4F89-41D3-9A0C-0305E82...",
        "h://someweirdtest^?",
        "https://some.uri that goes on!?",
    ],
)
def test_valid_uri(input_value):
    message = validate_uri(input_value)

    assert message == []


@pytest.mark.parametrize(
    "input_value", ["/invalid/uri", "http//uri", "http://some#uri", "some/uri", "some weird test"]
)
def test_invalid_uri(input_value):
    message = validate_uri(input_value)

    assert message == [
        f"must be a valid URI specified in RFC-3986 and must contain no fragment (#), but is: {input_value}"
    ]


@pytest.mark.parametrize("input_value", ["://spdx.org/spdxdocs/spdx-tools-v1.2-3F2504E0-4F89-41D3-9A0C-0305E82..."])
@pytest.mark.skip(
    "validate_uri() seems to invalidate URIs without scheme, so it does not run into this case. But I'm not sure yet "
    "if this covers all scheme-less examples."
    "https://github.com/spdx/tools-python/issues/377"
)
def test_uri_without_scheme(input_value):
    message = validate_uri(input_value)

    assert message == [f"must have a URI scheme, but is: {input_value}"]