Skip to content

Commit

Permalink
Merge pull request #1486 from hlohaus/copilot
Browse files Browse the repository at this point in the history
Improve tests
  • Loading branch information
hlohaus authored Jan 21, 2024
2 parents a98a9e9 + e13aa2e commit fea4f54
Show file tree
Hide file tree
Showing 13 changed files with 212 additions and 100 deletions.
8 changes: 3 additions & 5 deletions .github/workflows/copilot.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,10 @@ on:
- opened
- synchronize

env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

permissions: write-all

jobs:
review:
runs-on: ubuntu-latest
permissions: write-all
steps:
- name: Checkout Repo
uses: actions/checkout@v3
Expand All @@ -28,4 +24,6 @@ jobs:
- name: Install PyGithub
run: pip install PyGithub
- name: AI Code Review
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: python -m etc.tool.copilot
11 changes: 9 additions & 2 deletions .github/workflows/unittest.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,13 @@
name: Unittest

on: [push]
on:
pull_request:
types:
- opened
- synchronize
push:
branches:
- 'main'

jobs:
build:
Expand All @@ -16,4 +23,4 @@ jobs:
- name: Install requirements
run: pip install -r requirements.txt
- name: Run tests
run: python -m etc.unittest.main
run: python -m etc.unittest
6 changes: 6 additions & 0 deletions etc/unittest/__main__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import unittest
from .asyncio import *
from .backend import *
from .main import *

unittest.main()
57 changes: 57 additions & 0 deletions etc/unittest/asyncio.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
from .include import DEFAULT_MESSAGES
import asyncio
import nest_asyncio
import unittest
import g4f
from g4f import ChatCompletion
from .mocks import ProviderMock, AsyncProviderMock, AsyncGeneratorProviderMock

class TestChatCompletion(unittest.TestCase):

async def run_exception(self):
return ChatCompletion.create(g4f.models.default, DEFAULT_MESSAGES, AsyncProviderMock)

def test_exception(self):
self.assertRaises(g4f.errors.NestAsyncioError, asyncio.run, self.run_exception())

def test_create(self):
result = ChatCompletion.create(g4f.models.default, DEFAULT_MESSAGES, AsyncProviderMock)
self.assertEqual("Mock",result)

def test_create_generator(self):
result = ChatCompletion.create(g4f.models.default, DEFAULT_MESSAGES, AsyncGeneratorProviderMock)
self.assertEqual("Mock",result)

class TestChatCompletionAsync(unittest.IsolatedAsyncioTestCase):

async def test_base(self):
result = await ChatCompletion.create_async(g4f.models.default, DEFAULT_MESSAGES, ProviderMock)
self.assertEqual("Mock",result)

async def test_async(self):
result = await ChatCompletion.create_async(g4f.models.default, DEFAULT_MESSAGES, AsyncProviderMock)
self.assertEqual("Mock",result)

async def test_create_generator(self):
result = await ChatCompletion.create_async(g4f.models.default, DEFAULT_MESSAGES, AsyncGeneratorProviderMock)
self.assertEqual("Mock",result)

class TestChatCompletionNestAsync(unittest.IsolatedAsyncioTestCase):

def setUp(self) -> None:
nest_asyncio.apply()

async def test_create(self):
result = await ChatCompletion.create_async(g4f.models.default, DEFAULT_MESSAGES, ProviderMock)
self.assertEqual("Mock",result)

async def test_nested(self):
result = ChatCompletion.create(g4f.models.default, DEFAULT_MESSAGES, AsyncProviderMock)
self.assertEqual("Mock",result)

async def test_nested_generator(self):
result = ChatCompletion.create(g4f.models.default, DEFAULT_MESSAGES, AsyncGeneratorProviderMock)
self.assertEqual("Mock",result)

if __name__ == '__main__':
unittest.main()
38 changes: 38 additions & 0 deletions etc/unittest/backend.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
from . import include
import unittest
from unittest.mock import MagicMock
from .mocks import ProviderMock
import g4f
from g4f.gui.server.backend import Backend_Api, get_error_message

class TestBackendApi(unittest.TestCase):

def setUp(self):
self.app = MagicMock()
self.api = Backend_Api(self.app)

def test_version(self):
response = self.api.get_version()
self.assertIn("version", response)
self.assertIn("latest_version", response)

def test_get_models(self):
response = self.api.get_models()
self.assertIsInstance(response, list)
self.assertTrue(len(response) > 0)

def test_get_providers(self):
response = self.api.get_providers()
self.assertIsInstance(response, list)
self.assertTrue(len(response) > 0)

class TestUtilityFunctions(unittest.TestCase):

def test_get_error_message(self):
g4f.debug.last_provider = ProviderMock
exception = Exception("Message")
result = get_error_message(exception)
self.assertEqual("ProviderMock: Exception: Message", result)

if __name__ == '__main__':
unittest.main()
11 changes: 11 additions & 0 deletions etc/unittest/include.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import sys
import pathlib

sys.path.append(str(pathlib.Path(__file__).parent.parent.parent))

import g4f

g4f.debug.logging = False
g4f.debug.version_check = False

DEFAULT_MESSAGES = [{'role': 'user', 'content': 'Hello'}]
78 changes: 20 additions & 58 deletions etc/unittest/main.py
Original file line number Diff line number Diff line change
@@ -1,75 +1,37 @@
import sys
import pathlib
from .include import DEFAULT_MESSAGES
import unittest
from unittest.mock import MagicMock

sys.path.append(str(pathlib.Path(__file__).parent.parent.parent))

import asyncio
import g4f
from g4f import ChatCompletion, get_last_provider
from g4f.gui.server.backend import Backend_Api, get_error_message
from g4f.base_provider import BaseProvider

g4f.debug.logging = False
g4f.debug.version_check = False

class MockProvider(BaseProvider):
working = True

def create_completion(
model, messages, stream, **kwargs
):
yield "Mock"

async def create_async(
model, messages, **kwargs
):
return "Mock"

class TestBackendApi(unittest.TestCase):

def setUp(self):
self.app = MagicMock()
self.api = Backend_Api(self.app)

def test_version(self):
response = self.api.get_version()
self.assertIn("version", response)
self.assertIn("latest_version", response)
from g4f.Provider import RetryProvider
from .mocks import ProviderMock

class TestChatCompletion(unittest.TestCase):

def test_create_default(self):
messages = [{'role': 'user', 'content': 'Hello'}]
result = ChatCompletion.create(g4f.models.default, messages)
result = ChatCompletion.create(g4f.models.default, DEFAULT_MESSAGES)
if "Good" not in result and "Hi" not in result:
self.assertIn("Hello", result)

def test_get_last_provider(self):
messages = [{'role': 'user', 'content': 'Hello'}]
ChatCompletion.create(g4f.models.default, messages, MockProvider)
self.assertEqual(get_last_provider(), MockProvider)


def test_bing_provider(self):
messages = [{'role': 'user', 'content': 'Hello'}]
provider = g4f.Provider.Bing
result = ChatCompletion.create(g4f.models.default, messages, provider)
result = ChatCompletion.create(g4f.models.default, DEFAULT_MESSAGES, provider)
self.assertIn("Bing", result)

class TestChatCompletionAsync(unittest.IsolatedAsyncioTestCase):

async def test_async(self):
messages = [{'role': 'user', 'content': 'Hello'}]
result = await ChatCompletion.create_async(g4f.models.default, messages, MockProvider)
self.assertEqual("Mock", result)
class TestGetLastProvider(unittest.TestCase):

class TestUtilityFunctions(unittest.TestCase):

def test_get_error_message(self):
g4f.debug.last_provider = g4f.Provider.Bing
exception = Exception("Message")
result = get_error_message(exception)
self.assertEqual("Bing: Exception: Message", result)
def test_get_last_provider(self):
ChatCompletion.create(g4f.models.default, DEFAULT_MESSAGES, ProviderMock)
self.assertEqual(get_last_provider(), ProviderMock)

def test_get_last_provider_retry(self):
ChatCompletion.create(g4f.models.default, DEFAULT_MESSAGES, RetryProvider([ProviderMock]))
self.assertEqual(get_last_provider(), ProviderMock)

def test_get_last_provider_async(self):
coroutine = ChatCompletion.create_async(g4f.models.default, DEFAULT_MESSAGES, ProviderMock)
asyncio.run(coroutine)
self.assertEqual(get_last_provider(), ProviderMock)

if __name__ == '__main__':
unittest.main()
25 changes: 25 additions & 0 deletions etc/unittest/mocks.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
from g4f.Provider.base_provider import AbstractProvider, AsyncProvider, AsyncGeneratorProvider

class ProviderMock(AbstractProvider):
working = True

def create_completion(
model, messages, stream, **kwargs
):
yield "Mock"

class AsyncProviderMock(AsyncProvider):
working = True

async def create_async(
model, messages, **kwargs
):
return "Mock"

class AsyncGeneratorProviderMock(AsyncGeneratorProvider):
working = True

async def create_async_generator(
model, messages, stream, **kwargs
):
yield "Mock"
13 changes: 5 additions & 8 deletions g4f/Provider/Bing.py
Original file line number Diff line number Diff line change
Expand Up @@ -64,12 +64,7 @@ def create_async_generator(
prompt = messages[-1]["content"]
context = create_context(messages[:-1])

if not cookies:
cookies = Defaults.cookies
else:
for key, value in Defaults.cookies.items():
if key not in cookies:
cookies[key] = value
cookies = {**Defaults.cookies, **cookies} if cookies else Defaults.cookies

gpt4_turbo = True if model.startswith("gpt-4-turbo") else False

Expand Down Expand Up @@ -207,10 +202,12 @@ def create_message(
request_id = str(uuid.uuid4())
struct = {
'arguments': [{
'source': 'cib', 'optionsSets': options_sets,
'source': 'cib',
'optionsSets': options_sets,
'allowedMessageTypes': Defaults.allowedMessageTypes,
'sliceIds': Defaults.sliceIds,
'traceId': os.urandom(16).hex(), 'isStartOfSession': True,
'traceId': os.urandom(16).hex(),
'isStartOfSession': True,
'requestId': request_id,
'message': {
**Defaults.location,
Expand Down
Loading

0 comments on commit fea4f54

Please sign in to comment.