blob: 6c733cc061bf625fa7686060978f9829d211f303 [file] [log] [blame]
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from unittest.mock import mock_open
import mock
import pytest
from api.v1.api_pb2 import SDK_UNSPECIFIED, STATUS_UNSPECIFIED, \
STATUS_VALIDATING, \
STATUS_FINISHED, SDK_JAVA, \
PRECOMPILED_OBJECT_TYPE_EXAMPLE, PRECOMPILED_OBJECT_TYPE_KATA, \
PRECOMPILED_OBJECT_TYPE_UNIT_TEST
from grpc_client import GRPCClient
from helper import find_examples, Example, _get_example, _get_name, get_tag, \
_validate, Tag, get_statuses, \
_update_example_status, get_supported_categories, _check_file, \
_get_object_type, ExampleTag
@mock.patch("helper._check_file")
@mock.patch("helper.os.walk")
def test_find_examples_with_valid_tag(mock_os_walk, mock_check_file):
mock_os_walk.return_value = [("/root", (), ("file.java", ))]
mock_check_file.return_value = False
sdk = SDK_UNSPECIFIED
result = find_examples(work_dir="", supported_categories=[], sdk=sdk)
assert not result
mock_os_walk.assert_called_once_with("")
mock_check_file.assert_called_once_with(
examples=[],
filename="file.java",
filepath="/root/file.java",
supported_categories=[],
sdk=sdk)
@mock.patch("helper._check_file")
@mock.patch("helper.os.walk")
def test_find_examples_with_invalid_tag(mock_os_walk, mock_check_file):
mock_os_walk.return_value = [("/root", (), ("file.java", ))]
mock_check_file.return_value = True
sdk = SDK_UNSPECIFIED
with pytest.raises(
ValueError,
match="Some of the beam examples contain beam playground tag with "
"an incorrect format"):
find_examples("", [], sdk=sdk)
mock_os_walk.assert_called_once_with("")
mock_check_file.assert_called_once_with(
examples=[],
filename="file.java",
filepath="/root/file.java",
supported_categories=[],
sdk=sdk)
@pytest.mark.asyncio
@mock.patch("helper.GRPCClient")
@mock.patch("helper._update_example_status")
async def test_get_statuses(mock_update_example_status, mock_grpc_client):
example = Example(
name="file",
pipeline_id="pipeline_id",
sdk=SDK_UNSPECIFIED,
filepath="root/file.extension",
code="code",
output="output",
status=STATUS_UNSPECIFIED,
tag={"name": "Name"},
link="link")
client = None
mock_grpc_client.return_value = client
await get_statuses([example])
mock_update_example_status.assert_called_once_with(example, client)
@mock.patch(
"builtins.open",
mock_open(
read_data="...\n# beam-playground:\n# name: Name\n\nimport ..."))
def test_get_tag_when_tag_is_exists():
result = get_tag("")
assert result.tag_as_dict.get("name") == "Name"
assert result.tag_as_string == "# beam-playground:\n# name: Name\n\n"
@mock.patch("builtins.open", mock_open(read_data="...\n..."))
def test_get_tag_when_tag_does_not_exist():
result = get_tag("")
assert result is None
@mock.patch("helper._get_example")
@mock.patch("helper._validate")
@mock.patch("helper.get_tag")
def test__check_file_with_correct_tag(
mock_get_tag, mock_validate, mock_get_example):
tag = ExampleTag({"name": "Name"}, "")
example = Example(
name="filename",
sdk=SDK_JAVA,
filepath="/root/filename.java",
code="data",
status=STATUS_UNSPECIFIED,
tag=Tag("Name", "Description", False, [], '--option option'),
link="link")
examples = []
mock_get_tag.return_value = tag
mock_validate.return_value = True
mock_get_example.return_value = example
result = _check_file(
examples, "filename.java", "/root/filename.java", [], sdk=SDK_JAVA)
assert result is False
assert len(examples) == 1
assert examples[0] == example
mock_get_tag.assert_called_once_with("/root/filename.java")
mock_validate.assert_called_once_with(tag.tag_as_dict, [])
mock_get_example.assert_called_once_with(
"/root/filename.java", "filename.java", tag)
@mock.patch("helper._validate")
@mock.patch("helper.get_tag")
def test__check_file_with_incorrect_tag(mock_get_tag, mock_validate):
tag = ExampleTag({"name": "Name"}, "")
examples = []
sdk = SDK_JAVA
mock_get_tag.return_value = tag
mock_validate.return_value = False
result = _check_file(
examples, "filename.java", "/root/filename.java", [], sdk)
assert result is True
assert len(examples) == 0
mock_get_tag.assert_called_once_with("/root/filename.java")
mock_validate.assert_called_once_with(tag.tag_as_dict, [])
@mock.patch("builtins.open", mock_open(read_data="categories:\n - category"))
def test_get_supported_categories():
result = get_supported_categories("")
assert len(result) == 1
assert result[0] == "category"
@mock.patch("builtins.open", mock_open(read_data="data"))
@mock.patch("helper._get_name")
def test__get_example(mock_get_name):
mock_get_name.return_value = "filepath"
tag = ExampleTag({
"name": "Name",
"description": "Description",
"multifile": "False",
"categories": [""],
"pipeline_options": "--option option",
"context_line": 1
},
"")
result = _get_example("/root/filepath.java", "filepath.java", tag)
assert result == Example(
name="filepath",
sdk=SDK_JAVA,
filepath="/root/filepath.java",
code="data",
status=STATUS_UNSPECIFIED,
tag=Tag(
"Name", "Description", "False", [""], "--option option", False, 1),
link="https://github.com/apache/beam/blob/master/root/filepath.java")
mock_get_name.assert_called_once_with("filepath.java")
def test__validate_without_name_field():
tag = {}
assert _validate(tag, []) is False
def test__validate_without_description_field():
tag = {"name": "Name"}
assert _validate(tag, []) is False
def test__validate_without_multifile_field():
tag = {"name": "Name", "description": "Description"}
assert _validate(tag, []) is False
def test__validate_with_incorrect_multifile_field():
tag = {"name": "Name", "description": "Description", "multifile": "Multifile"}
assert _validate(tag, []) is False
def test__validate_without_categories_field():
tag = {"name": "Name", "description": "Description", "multifile": "true"}
assert _validate(tag, []) is False
def test__validate_without_incorrect_categories_field():
tag = {
"name": "Name",
"description": "Description",
"multifile": "true",
"categories": "Categories"
}
assert _validate(tag, []) is False
def test__validate_with_not_supported_category():
tag = {
"name": "Name",
"description": "Description",
"multifile": "true",
"categories": ["category1"]
}
assert _validate(tag, ["category"]) is False
def test__validate_with_all_fields():
tag = {
"name": "Name",
"description": "Description",
"multifile": "true",
"categories": ["category"],
"pipeline_options": "--option option",
"context_line": 1
}
assert _validate(tag, ["category"]) is True
def test__get_name():
result = _get_name("filepath.extension")
assert result == "filepath"
@pytest.mark.asyncio
@mock.patch("grpc_client.GRPCClient.check_status")
@mock.patch("grpc_client.GRPCClient.run_code")
async def test__update_example_status(
mock_grpc_client_run_code, mock_grpc_client_check_status):
example = Example(
name="file",
pipeline_id="pipeline_id",
sdk=SDK_UNSPECIFIED,
filepath="root/file.extension",
code="code",
output="output",
status=STATUS_UNSPECIFIED,
tag={"pipeline_options": "--key value"},
link="link")
mock_grpc_client_run_code.return_value = "pipeline_id"
mock_grpc_client_check_status.side_effect = [
STATUS_VALIDATING, STATUS_FINISHED
]
await _update_example_status(example, GRPCClient())
assert example.pipeline_id == "pipeline_id"
assert example.status == STATUS_FINISHED
mock_grpc_client_run_code.assert_called_once_with(
example.code, example.sdk, "--key value")
mock_grpc_client_check_status.assert_has_calls([mock.call("pipeline_id")])
def test__get_object_type():
result_example = _get_object_type(
"filename.extension", "filepath/examples/filename.extension")
result_kata = _get_object_type(
"filename.extension", "filepath/katas/filename.extension")
result_test = _get_object_type(
"filename_test.extension", "filepath/examples/filename_test.extension")
assert result_example == PRECOMPILED_OBJECT_TYPE_EXAMPLE
assert result_kata == PRECOMPILED_OBJECT_TYPE_KATA
assert result_test == PRECOMPILED_OBJECT_TYPE_UNIT_TEST