Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 3 additions & 6 deletions connect/eaas/core/extension.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@
import inspect
import json
import os
from importlib.resources import files
from typing import Dict, List, Union

import anvil.server
import pkg_resources
from fastapi import APIRouter

from connect.client import AsyncConnectClient, ConnectClient
Expand All @@ -31,7 +31,7 @@
class ApplicationBase:

@classmethod
def get_descriptor(cls) -> dict: # pragma: no cover
def get_descriptor(cls) -> dict:
"""
Returns the **extension.json** extension descriptor.

Expand All @@ -50,10 +50,7 @@ def get_descriptor(cls) -> dict: # pragma: no cover
```
"""
return json.load(
pkg_resources.resource_stream(
cls.__module__,
'extension.json',
),
files(cls.__module__).joinpath('extension.json').open('r'),
)

@classmethod
Expand Down
58 changes: 57 additions & 1 deletion tests/connect/eaas/core/test_extension.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import json
import os
from importlib.metadata import EntryPoint

import pytest
from fastapi_utils.inferring_router import InferringRouter
from pkg_resources import EntryPoint

from connect.client import AsyncConnectClient, ConnectClient
from connect.eaas.core.constants import UNAUTHORIZED_ENDPOINT_ATTR_NAME
Expand Down Expand Up @@ -131,6 +132,61 @@ async def schedulable2(self, request):
assert MyExtension(None, None, None).schedulable1.__doc__ == 'This is schedulable'


def test_get_descriptor(tmp_path, monkeypatch):
pkg_dir = tmp_path / 'fake_ext'
pkg_dir.mkdir()
(pkg_dir / '__init__.py').write_text('')
descriptor = {
'name': 'Test Extension',
'description': 'A test extension',
'version': '1.0.0',
'audience': ['vendor'],
}
(pkg_dir / 'extension.json').write_text(json.dumps(descriptor))

monkeypatch.syspath_prepend(str(tmp_path))

class MyExtension(EventsApplicationBase):
pass

MyExtension.__module__ = 'fake_ext'

assert MyExtension.get_descriptor() == descriptor


def test_get_descriptor_file_not_found(tmp_path, monkeypatch):
pkg_dir = tmp_path / 'fake_ext_no_json'
pkg_dir.mkdir()
(pkg_dir / '__init__.py').write_text('')

monkeypatch.syspath_prepend(str(tmp_path))

class MyExtension(EventsApplicationBase):
pass

MyExtension.__module__ = 'fake_ext_no_json'

with pytest.raises(FileNotFoundError):
MyExtension.get_descriptor()


def test_get_descriptor_invalid_json(tmp_path, monkeypatch):
pkg_dir = tmp_path / 'fake_ext_bad_json'
pkg_dir.mkdir()
(pkg_dir / '__init__.py').write_text('')
(pkg_dir / 'extension.json').write_text('not valid json{')

monkeypatch.syspath_prepend(str(tmp_path))

class MyExtension(EventsApplicationBase):
pass

MyExtension.__module__ = 'fake_ext_bad_json'

with pytest.raises(json.JSONDecodeError):
MyExtension.get_descriptor()


def test_get_variables():

vars = [
Expand Down
59 changes: 45 additions & 14 deletions tests/connect/eaas/core/validation/test_helpers.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
from connect.eaas.core.validation.helpers import get_code_context


def test_get_code_context_module(mocker, faker):
def test_get_code_context_module(mocker):
mocker.patch(
'connect.eaas.core.validation.helpers.inspect.getsourcefile',
return_value='path/file.py',
)

code_lines = [f'{line}\n' for line in faker.paragraphs(nb=10)]

code = ''.join(code_lines)
pattern = 'target_pattern'
pattern_line = 6
code_lines = [f'line {i}\n' for i in range(10)]
code_lines[pattern_line] = f'something {pattern} something\n'

mocker.patch(
'connect.eaas.core.validation.helpers.inspect.getsourcelines',
Expand All @@ -23,23 +24,25 @@ def test_get_code_context_module(mocker, faker):
return_value=True,
)

result = get_code_context(mocker.MagicMock(), 'country store build before')
result = get_code_context(mocker.MagicMock(), pattern)

expected_lineno = 1 + pattern_line
assert result['file'] == 'path/file.py'
assert result['start_line'] == 1
assert result['lineno'] == 7
assert result['code'] == ''.join(code.splitlines(keepends=True)[0:7 + 3])
assert result['lineno'] == expected_lineno
assert result['code'] == ''.join(code_lines[0:expected_lineno + 3])


def test_get_code_context_function(mocker, faker):
def test_get_code_context_function(mocker):
mocker.patch(
'connect.eaas.core.validation.helpers.inspect.getsourcefile',
return_value='path/file.py',
)

code_lines = [f'{line}\n' for line in faker.paragraphs(nb=10)]

code = ''.join(code_lines)
pattern = 'target_pattern'
pattern_line = 6
code_lines = [f'line {i}\n' for i in range(10)]
code_lines[pattern_line] = f'something {pattern} something\n'

mocker.patch(
'connect.eaas.core.validation.helpers.inspect.getsourcelines',
Expand All @@ -53,9 +56,37 @@ def test_get_code_context_function(mocker, faker):
return_value=False,
)

result = get_code_context(mocker.MagicMock(), 'country store build before')
result = get_code_context(mocker.MagicMock(), pattern)

assert result['file'] == 'path/file.py'
assert result['start_line'] == 1
assert result['lineno'] == 7
assert result['code'] == ''.join(code.splitlines(keepends=True))
assert result['lineno'] == 1 + pattern_line
assert result['code'] == ''.join(code_lines)


def test_get_code_context_pattern_not_found(mocker):
mocker.patch(
'connect.eaas.core.validation.helpers.inspect.getsourcefile',
return_value='path/file.py',
)

code_lines = [f'line {i}\n' for i in range(10)]

mocker.patch(
'connect.eaas.core.validation.helpers.inspect.getsourcelines',
return_value=(
code_lines,
5,
),
)
mocker.patch(
'connect.eaas.core.validation.helpers.inspect.ismodule',
return_value=False,
)

result = get_code_context(mocker.MagicMock(), 'nonexistent_pattern')

assert result['file'] == 'path/file.py'
assert result['start_line'] == 5
assert result['lineno'] == 5
assert result['code'] == ''.join(code_lines)