示例#1
0
 def test_it_injects_headers(self):
     a_request = MagicMock(spec_set=Request)
     a_request.method = HttpMethod.GET
     a_request.headers = [Header(name="some_header", value="some_value")]
     task = Task("some_task", a_request)
     action = task.as_locust_action()
     assert "some_value" in action
示例#2
0
 def test_it_returns_a_task_using_post_given_a_post_http_method(self):
     a_request = MagicMock(spec_set=Request)
     a_request.method = HttpMethod.POST
     a_request.post_data = {}
     task = Task("some_task", a_request)
     action = task.as_locust_action()
     assert action.startswith("response = self.client.post(")
示例#3
0
 def test_records_global_code_blocks_from_tasks(self):
     t1_blocks = {"t1-1": ["abc"], "t1-2": ["def"]}
     t1 = Task("t1", request=MagicMock(), global_code_blocks=t1_blocks)
     t2 = Task("t2", request=MagicMock())
     t3_blocks = {"t3-1": ("xyz",)}
     t3 = Task("t3", request=MagicMock(), global_code_blocks=t3_blocks)
     scenario = Scenario("scenario", [t1, t2, t3], origin=None)
     assert scenario.global_code_blocks == {**t1_blocks, **t3_blocks}
示例#4
0
 def test_it_encodes_data_in_task_for_text_mime(self):
     decoded_value = '{"formatted": "54,95 €"}'
     a_request = MagicMock(spec_set=Request)
     a_request.method = HttpMethod.POST
     a_request.post_data = {"text": decoded_value}
     task = Task("some_task", a_request)
     action = task.as_locust_action()
     assert str(decoded_value.encode()) in action
示例#5
0
 def test_it_returns_a_task_using_delete_given_a_delete_http_method(self):
     a_request = MagicMock(spec_set=Request)
     a_request.method = HttpMethod.DELETE
     a_request.url = urlparse(
         "http://www.some.web.site/?some_name=some_value")
     task = Task("some_task", a_request)
     action = task.as_locust_action()
     assert action.startswith("response = self.client.delete(")
     assert "?some_name=some_value" in action
示例#6
0
 def test_it_returns_a_task_using_put_given_a_put_http_method(self):
     a_request = MagicMock(spec_set=Request)
     a_request.method = HttpMethod.PUT
     a_request.post_data = {"text": "{'some key': 'some value'}"}
     a_request.query = [QueryPair(name="some name", value="some value")]
     task = Task("some_task", a_request)
     action = task.as_locust_action()
     assert action.startswith("response = self.client.put(")
     assert "params={'some name': 'some value'}" in action
     assert "data=b\"{'some key': 'some value'}\"" in action
示例#7
0
 def test_post_processing_returns_an_indented_string_given_an_indentation(
         self):
     a_request = MagicMock(spec_set=Request)
     a_request.method = HttpMethod.GET
     task = Task("some_task", a_request)
     new_post_processings = (*task.locust_postprocessing,
                             "def some_function():")
     task = task._replace(locust_postprocessing=new_post_processings)
     action = task.as_locust_action(indentation=2)
     assert "  def some_function():" in action
示例#8
0
 def test_group_records_global_code_blocks_from_scenarios(self):
     t1_blocks = {"t1-1": ["abc"], "t1-2": ["def"]}
     t1 = Task("t1", request=MagicMock(), global_code_blocks=t1_blocks)
     t2 = Task("t2", request=MagicMock())
     t3_blocks = {"t3-1": ("xyz",)}
     t3 = Task("t3", request=MagicMock(), global_code_blocks=t3_blocks)
     s1 = Scenario("s1", [t1, t2], origin=None)
     s2 = Scenario("s2", [t3], origin=None)
     sg = Scenario("sg", [s1, s2], origin=None)
     assert sg.global_code_blocks == {**t1_blocks, **t3_blocks}
示例#9
0
 def test_it_encodes_data_in_task_for_json_mime(self):
     decoded_value = '{"formatted": "54,95 €"}'
     a_request = MagicMock(spec_set=Request)
     a_request.method = HttpMethod.POST
     a_request.post_data = {
         "text": decoded_value,
         "mimeType": "application/json"
     }
     task = Task("some_task", a_request)
     action = task.as_locust_action()
     assert str(json.loads(decoded_value)) in action
示例#10
0
 def test_it_returns_a_task_using_options_given_an_options_http_method(
         self):
     a_request = MagicMock(spec_set=Request)
     a_request.method = HttpMethod.OPTIONS
     a_request.headers = [
         Header(name="Access-Control-Request-Method", value="POST")
     ]
     task = Task("some_task", a_request)
     action = task.as_locust_action()
     assert action.startswith("response = self.client.options(")
     assert "headers={'Access-Control-Request-Method': 'POST'" in action
示例#11
0
 def test_it_respects_sub_indentation_levels(self):
     a_request = MagicMock(spec_set=Request)
     a_request.method = HttpMethod.GET
     task = Task("some_task", a_request)
     new_pre_processings = (
         *task.locust_preprocessing,
         "\n  def function():\n   if True:\n    print(True)",
     )
     task = task._replace(locust_preprocessing=new_pre_processings)
     action = task.as_locust_action(indentation=1)
     assert action.startswith(
         " \n def function():\n  if True:\n   print(True)")
示例#12
0
 def test_it_returns_action_from_locust_request(self):
     a_request = MagicMock(spec_set=Request)
     a_request.method = HttpMethod.GET
     locust_request = LocustRequest(method=HttpMethod.GET,
                                    url=repr("http://locust-task"),
                                    headers={})
     task = Task("some_task",
                 request=a_request,
                 locust_request=locust_request)
     action = task.as_locust_action()
     assert action.startswith(
         "response = self.client.get(url='http://locust-task'")
示例#13
0
        def test_it_returns_a_task_with_the_replaced_url(self):
            locust_request = LocustRequest(
                method=MagicMock(), url=MagicMock(), headers=MagicMock()
            )
            task = Task(
                name="some name", request=MagicMock(), locust_request=locust_request
            )
            expected_url = 'f"http://a.b.c/{some.value}/"'

            modified_task = Task.replace_url(task, expected_url)

            assert modified_task.locust_request.url == expected_url
示例#14
0
 def test_it_applies_indentation_to_all_pre_processings(self):
     a_request = MagicMock(spec_set=Request)
     a_request.method = HttpMethod.GET
     task = Task("some_task", a_request)
     new_pre_processings = (
         *task.locust_preprocessing,
         "def some_function():",
         "def some_other_function():",
     )
     task = task._replace(locust_preprocessing=new_pre_processings)
     action = task.as_locust_action(indentation=2)
     assert action.startswith(
         "  def some_function():\n\n  def some_other_function():")
示例#15
0
    def test_it_returns_a_task_with_the_injected_headers(self):
        locust_request = LocustRequest(method=MagicMock(),
                                       url=MagicMock(),
                                       headers={"x-forwarded-for": ""})
        task = Task(name="some name",
                    request=MagicMock(),
                    locust_request=locust_request)
        expected_headers = {"x-forwarded-for": "1.2.3.4"}
        modified_task = Task.inject_headers(task, headers=expected_headers)

        assert isinstance(modified_task, Task)

        headers = modified_task.locust_request.headers
        assert len(headers) == 1
        assert headers == expected_headers
示例#16
0
    def from_har_file(
        cls,
        path: Path,
        plugins: Sequence[Plugin],
        ts_plugins: Sequence[Plugin],
        short_name: bool,
        blacklist: Blacklist,
    ) -> "Scenario":
        """
        Creates a Scenario given a HAR file.

        :raise SkippableScenarioError: if path is unreadable or not a HAR file
        """
        try:
            with path.open() as file:
                har = json.load(file)
            requests = Request.all_from_har(har)
            tasks = Task.from_requests(requests, blacklist)

            # TODO: Remove this when Contract.OnTaskSequence is removed.
            tasks = plug.apply(ts_plugins, tasks)

            # TODO: Remove Task-to-Task2 conversion once both are merged.
            tasks = tuple(
                plug.apply(plugins, Task2.from_task(t)) for t in tasks)

            return Scenario(
                name=to_identifier(
                    path.with_suffix("").name if short_name else str(path)),
                children=tuple(tasks),
                origin=path,
                weight=cls.weight_from_path(path),
            )
        except (OSError, json.JSONDecodeError, UnicodeDecodeError) as err:
            raise SkippableScenarioError(path, err)
示例#17
0
 def test_it_creates_a_task_if_the_path_not_host_is_on_the_blacklist(
         self, mock_open):
     mock_open.return_value = io.StringIO("search\namazon")
     request = MagicMock()
     request.url = urlparse("https://www.google.com/search?&q=amazon")
     task = Task.from_requests([request])
     assert len(list(task)) == 1
示例#18
0
 def test_it_returns_a_task(self):
     request = MagicMock()
     request.timestamp = 1
     second_request = MagicMock()
     second_request.timestamp = 2
     assert all(
         isinstance(t, Task)
         for t in Task.from_requests([request, second_request]))
示例#19
0
 def test_it_doesnt_create_a_task_if_the_url_is_on_the_blacklist(
         self, mock_open):
     mock_open.return_value = io.StringIO("amazon")
     request = MagicMock()
     request.url = MagicMock()
     request.url.netloc = "www.amazon.com"
     task = Task.from_requests([request])
     assert len(list(task)) == 0
    def test_it_renders_a_locustfile_template(self):
        a_name = "some_task"
        a_request = MagicMock(spec=Request)
        a_request.method = HttpMethod.GET
        a_request.url = MagicMock(spec=SplitResult)
        a_request.url.scheme = "some_scheme"
        a_request.url.hostname = "some_hostname"
        a_request.url.path = "some_path"
        a_request.url.geturl()
        a_request.url.geturl.return_value = "some_url"
        a_request.headers = {"a": "b"}
        a_request.name = None
        task = Task(a_name, a_request)
        scenario = Scenario(name="SomeScenario", children=[task], origin=None)
        scenario_group = Scenario(name="ScenarioGroup",
                                  children=[scenario],
                                  weight=2,
                                  origin=None)
        script = locustfile([scenario_group])
        expected = string.Template(f"""
# File automatically generated by Transformer v{__version__}:
# https://github.com/zalando-incubator/Transformer
import re
from distutils.version import LooseVersion
from locust import __version__
LOCUST_MAJOR_VERSION = LooseVersion(__version__).version[0]
if LOCUST_MAJOR_VERSION >= 1:
    from locust import HttpUser
    from locust import SequentialTaskSet
    from locust import TaskSet
    from locust import task
    HttpLocust = HttpUser
    TaskSequence = SequentialTaskSet
    def seq_task(_):
        return task
else:
    from locust import HttpLocust
    from locust import TaskSequence
    from locust import TaskSet
    from locust import seq_task
    from locust import task
class ScenarioGroup(TaskSet):
    @task(1)
    class SomeScenario(TaskSequence):
        @seq_task(1)
        def some_task(self):
            response = self.client.get(url='some_url', name='some_url', timeout=$TIMEOUT, allow_redirects=False, headers={{'a': 'b'}})
class LocustForScenarioGroup(HttpLocust):
    if LOCUST_MAJOR_VERSION >= 1:
        tasks = [ScenarioGroup]
    else:
        task_set = ScenarioGroup
    weight = 2
    min_wait = 0
    max_wait = 10
""").safe_substitute({"TIMEOUT": TIMEOUT})
        assert expected.strip() == script.strip()
示例#21
0
 def test_group_records_global_code_blocks_uniquely(self):
     common_blocks = {"x": ["a", "b"]}
     t1 = Task(
         "t1",
         request=MagicMock(),
         global_code_blocks={**common_blocks, "t1b": ["uvw"]},
     )
     t2 = Task(
         "t2",
         request=MagicMock(),
         global_code_blocks={**common_blocks, "t2b": ["xyz"]},
     )
     s1 = Scenario("s1", [t1], origin=None)
     s2 = Scenario("s2", [t2], origin=None)
     sg = Scenario("sg", [s1, s2], origin=None)
     assert sg.global_code_blocks == {
         **common_blocks,
         "t1b": ["uvw"],
         "t2b": ["xyz"],
     }
示例#22
0
 def test_it_converts_post_params_to_post_text(self):
     a_request = MagicMock(spec_set=Request)
     a_request.method = HttpMethod.POST
     a_request.post_data = {
         "mimeType":
         "application/json",
         "params": [
             {
                 "name": "username",
                 "value": "some user"
             },
             {
                 "name": "password",
                 "value": "some password"
             },
         ],
     }
     task = Task("some task", a_request)
     action = task.as_locust_action()
     assert "'username': '******'" in action
     assert "'password': '******'" in action
示例#23
0
        def test_without_locust_request_it_proxies_the_request(self):
            req = Mock(spec_set=Request)
            task = Task(name="T", request=req)
            task2 = Task2.from_task(task)

            assert task2.name == "T"
            assert task2.request == req
            assert len(task2.statements) == 1

            assign = task2.statements[0]
            assert isinstance(assign, py.Assignment)
            assert assign.lhs == "response"

            assert isinstance(assign.rhs, py.ExpressionView)
            assert assign.rhs.target() == task2.request
            assert assign.rhs.converter is req_to_expr
示例#24
0
    def test_it_renders_a_locustfile_template(self):
        a_name = "some_task"
        a_request = MagicMock()
        a_request.method = HttpMethod.GET
        a_request.url.scheme = "some_scheme"
        a_request.url.hostname = "some_hostname"
        a_request.url.path = "some_path"
        a_request.url.geturl()
        a_request.url.geturl.return_value = "some_url"
        task = Task(a_name, a_request)
        scenario = Scenario(name="SomeScenario", children=[task], origin=None)
        scenario_group = Scenario(name="ScenarioGroup",
                                  children=[scenario],
                                  weight=2,
                                  origin=None)
        script = locustfile([scenario_group])
        expected = string.Template("""
# File automatically generated by Transformer:
# https://github.bus.zalan.do/TIP/transformer
import re
from locust import HttpLocust
from locust import TaskSequence
from locust import TaskSet
from locust import seq_task
from locust import task
class ScenarioGroup(TaskSet):
    @task(1)
    class SomeScenario(TaskSequence):
        @seq_task(1)
        def some_task(self):
            response = self.client.get(url='some_url', name='some_url', headers={}, timeout=$TIMEOUT, allow_redirects=False)
class LocustForScenarioGroup(HttpLocust):
    task_set = ScenarioGroup
    weight = 2
    min_wait = 0
    max_wait = 10
""").safe_substitute({"TIMEOUT": TIMEOUT})
        assert expected.strip() == script.strip()
示例#25
0
 def test_it_provides_timeout_to_requests(self):
     a_request = MagicMock(spec_set=Request)
     a_request.method = HttpMethod.GET
     task = Task("some_task", a_request)
     action = task.as_locust_action()
     assert f"timeout={TIMEOUT}" in action
示例#26
0
    def test_it_creates_a_locust_request_when_there_is_none(self):
        task = Task(name="some name", request=MagicMock())

        modified_task = Task.inject_headers(task, {})

        assert modified_task.locust_request
示例#27
0
        def test_it_creates_a_locust_request_when_there_is_none(self):
            task = Task(name="some name", request=MagicMock())

            modified_task = Task.replace_url(task, "")

            assert modified_task.locust_request
示例#28
0
 def test_it_returns_an_error_given_an_unsupported_http_method(self):
     a_request_with_an_unsupported_http_method = MagicMock()
     task = Task("some_task", a_request_with_an_unsupported_http_method)
     with pytest.raises(ValueError):
         task.as_locust_action()
示例#29
0
 def test_it_returns_a_string(self):
     a_request = MagicMock(spec_set=Request)
     a_request.method = HttpMethod.GET
     task = Task("some_task", a_request)
     assert isinstance(task.as_locust_action(), str)