Added integration testing.
This commit is contained in:
		
							
								
								
									
										0
									
								
								tests/step_defs/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								tests/step_defs/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										17
									
								
								tests/step_defs/conftest.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								tests/step_defs/conftest.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,17 @@
 | 
			
		||||
"""PyTest configuration."""
 | 
			
		||||
 | 
			
		||||
from pytest import fixture
 | 
			
		||||
from .server import Server
 | 
			
		||||
from .page import Page
 | 
			
		||||
 | 
			
		||||
@fixture
 | 
			
		||||
def server():
 | 
			
		||||
    """Create a server instance."""
 | 
			
		||||
    serv = Server()
 | 
			
		||||
    yield serv
 | 
			
		||||
    serv.destroy()
 | 
			
		||||
 | 
			
		||||
@fixture
 | 
			
		||||
def page():
 | 
			
		||||
    pg = Page()
 | 
			
		||||
    return pg
 | 
			
		||||
							
								
								
									
										22
									
								
								tests/step_defs/page.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								tests/step_defs/page.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,22 @@
 | 
			
		||||
"""Fisture class for page functions."""
 | 
			
		||||
 | 
			
		||||
from urllib import request
 | 
			
		||||
from urllib.error import HTTPError
 | 
			
		||||
 | 
			
		||||
class Page:
 | 
			
		||||
    """Class for getting an individual page."""
 | 
			
		||||
 | 
			
		||||
    def __init__(self):
 | 
			
		||||
        """Init function."""
 | 
			
		||||
        self.res = None
 | 
			
		||||
 | 
			
		||||
    def request_url(self, url):
 | 
			
		||||
        """Make a page request."""
 | 
			
		||||
        try:
 | 
			
		||||
            self.res = request.urlopen(url)
 | 
			
		||||
        except HTTPError as err:
 | 
			
		||||
            self.res = err
 | 
			
		||||
 | 
			
		||||
    def get_status_code(self):
 | 
			
		||||
        """Return the status code."""
 | 
			
		||||
        return self.res.status
 | 
			
		||||
							
								
								
									
										40
									
								
								tests/step_defs/server.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								tests/step_defs/server.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,40 @@
 | 
			
		||||
"""Fixture for setting up a single server."""
 | 
			
		||||
 | 
			
		||||
from asyncio import create_subprocess_exec, get_event_loop, sleep
 | 
			
		||||
from pathlib import Path
 | 
			
		||||
 | 
			
		||||
class Server:
 | 
			
		||||
    """Setup a single server."""
 | 
			
		||||
 | 
			
		||||
    def __init__(self):
 | 
			
		||||
        """Initialization of a server."""
 | 
			
		||||
        self.settings = {}
 | 
			
		||||
        self.settings["address"] = "127.0.0.1"
 | 
			
		||||
        self.settings["port"] = 9090
 | 
			
		||||
        self.process = None
 | 
			
		||||
        self.loop = get_event_loop()
 | 
			
		||||
 | 
			
		||||
    async def __start(self):
 | 
			
		||||
        """async start of the server."""
 | 
			
		||||
        self.process = await create_subprocess_exec(
 | 
			
		||||
                Path.cwd().joinpath("target", "release", "morethantext_web")
 | 
			
		||||
                )
 | 
			
		||||
        await sleep(1)
 | 
			
		||||
 | 
			
		||||
    async def __stop(self):
 | 
			
		||||
        """async stop of the server."""
 | 
			
		||||
        if self.process is not None and self.process.returncode is None:
 | 
			
		||||
            self.process.terminate()
 | 
			
		||||
            await self.process.wait()
 | 
			
		||||
 | 
			
		||||
    def start(self):
 | 
			
		||||
        """Start the server."""
 | 
			
		||||
        self.loop.run_until_complete(self.__start())
 | 
			
		||||
 | 
			
		||||
    def stop(self):
 | 
			
		||||
        """Stop the server."""
 | 
			
		||||
        self.loop.run_until_complete(self.__stop())
 | 
			
		||||
 | 
			
		||||
    def destroy(self):
 | 
			
		||||
        """Removes the server instance."""
 | 
			
		||||
        self.stop()
 | 
			
		||||
							
								
								
									
										25
									
								
								tests/step_defs/test_server_start.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								tests/step_defs/test_server_start.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,25 @@
 | 
			
		||||
"""Interpratures for server start features."""
 | 
			
		||||
 | 
			
		||||
from pytest_bdd import given, scenarios, then, when
 | 
			
		||||
 | 
			
		||||
scenarios("../features/server_start.feature")
 | 
			
		||||
 | 
			
		||||
@given("a server")
 | 
			
		||||
def create_server(server):
 | 
			
		||||
    """Set up a server."""
 | 
			
		||||
 | 
			
		||||
@given("it is running")
 | 
			
		||||
def start_server(server):
 | 
			
		||||
    """Start up the server."""
 | 
			
		||||
    server.start()
 | 
			
		||||
 | 
			
		||||
@when("the home page is accessed")
 | 
			
		||||
def access_home_page(server, page):
 | 
			
		||||
    """Access the home page."""
 | 
			
		||||
    url = f"http://{server.settings['address']}:{server.settings['port']}/"
 | 
			
		||||
    page.request_url(url)
 | 
			
		||||
 | 
			
		||||
@then("the status should be OK")
 | 
			
		||||
def check_for_ok(page):
 | 
			
		||||
    """Is the page status code 200"""
 | 
			
		||||
    assert page.get_status_code() == 200
 | 
			
		||||
		Reference in New Issue
	
	Block a user