def test_permission_for_spec_directories(simple_config, route, permission, status) -> None: """Allow (200) or deny (403) access to the spec/explorer view.""" with tempfile.TemporaryDirectory() as directory: spec_name = os.path.join(directory, "openapi.yaml") spec_paths_name = os.path.join(directory, "paths.yaml") with open(spec_name, "wb") as f: f.write(SPLIT_OPENAPI_YAML) with open(spec_paths_name, "wb") as f: f.write(SPLIT_PATHS_YAML) simple_config.pyramid_openapi3_spec_directory( spec_name, route="/api/v1/spec", route_name="api_spec", permission=permission, ) simple_config.pyramid_openapi3_add_explorer( route="/api/v1/", route_name="api_explorer", permission=permission, ) simple_config.add_route("foo", "/foo") testapp = TestApp(simple_config.make_wsgi_app()) testapp.get(route, status=status)
class ResponsePageTestCase(DatastoreBaseCase): def setUp(self): super(ResponsePageTestCase, self).setUp() self.app = TestApp(application) def test_get(self): self.login(**DatastoreBaseCase.DEFAULT_USER) resp = self.app.get('/respond') resp.mustcontain( '<h1>Respond to a Quiz</h1>', '<input name="pin" id="pin" class="form-control" type="number" ' 'value="0">', '<h4>Current User: [email protected]</h4>', '<h4>Submitted Response: </h4>') def test_get_login_required(self): resp = self.app.get('/respond', status=302) resp.mustcontain(no=[ '<h1>Respond to a Quiz</h1>', '<input name="pin" id="pin" class="form-control" type="number" ' 'value="0">', '<h4>Current User: [email protected]</h4>', '<h4>Submitted Response: </h4>']) def test_post(self): self.login(**DatastoreBaseCase.DEFAULT_USER) resp = self.app.post('/respond?pin=7&answer=B') resp.mustcontain( '<h1>Respond to a Quiz</h1>', '<input name="pin" id="pin" class="form-control" type="number" ' 'value="7">', '<h4>Current User: [email protected]</h4>', '<h4>Submitted Response: B</h4>') def test_post_no_pin(self): self.login(**DatastoreBaseCase.DEFAULT_USER) resp = self.app.post('/respond?answer=B') resp.mustcontain( '<h1>Respond to a Quiz</h1>', '<input name="pin" id="pin" class="form-control" type="number" ' 'value="-1">', '<h4>Current User: [email protected]</h4>', '<h4>Submitted Response: B</h4>') def test_post_login_required(self): resp = self.app.post('/respond?pin=7&answer=B', status=302) resp.mustcontain(no=[ '<h1>Respond to a Quiz</h1>', '<input name="pin" id="pin" class="form-control" type="number" ' 'value="7">', '<h4>Current User: [email protected]</h4>', '<h4>Submitted Response: B</h4>'])
def test_permission_for_specs(route, permission, status) -> None: """Allow (200) or deny (403) access to the spec/explorer view.""" with tempfile.NamedTemporaryFile() as document: document.write(OPENAPI_YAML.encode()) document.seek(0) testapp = TestApp(app(document.name, permission)) testapp.get(route, status=status)
class UserPageTestCase(DatastoreBaseCase): def setUp(self): super(UserPageTestCase, self).setUp() self.app = TestApp(application) def test_get(self): self.login(**DatastoreBaseCase.DEFAULT_USER) resp = self.app.get('/user') resp.mustcontain( '<h1>User Page</h1>') def test_get_login_required(self): resp = self.app.get('/user', status=302) resp.mustcontain(no=[ '<h1>User Page</h1>'])
class DashboardPageTestCase(DatastoreBaseCase): def setUp(self): super(DashboardPageTestCase, self).setUp() self.app = TestApp(application) def test_get(self): self.login(**DatastoreBaseCase.DEFAULT_USER) resp = self.app.get('/home') resp.mustcontain( '<h1>Dashboard</h1>', '<h3>Welcome [email protected]</h3>') def test_get_login_required(self): resp = self.app.get('/home', status=302) resp.mustcontain(no=[ '<h1>Dashboard</h1>', '<h3>Welcome [email protected]</h3>'])
class AboutPageTestCase(DatastoreBaseCase): def setUp(self): super(AboutPageTestCase, self).setUp() self.app = TestApp(application) def test_get(self): resp = self.app.get('/') resp.mustcontain( '<h1>Welcome to Clicker</h1>', '<li><a href="{url}">Login</a></li>'.format( url=users.create_login_url('/home')))
def submit_attachment(url, message, attachments): click.echo('running against %s!' % url) # files = [('attachments', (attachment, open(path.abspath(attachment)))) for attachment in attachments] browser = TestApp(url) submit_page = browser.get('/briefkasten/') submit_form = submit_page.forms['briefkasten-form'] submit_form['message'] = u'Hello there' try: response = submit_form.submit() import pdb; pdb.set_trace() click.echo(u'Got %s' % response.url) except AppError as exc: click.echo(u'Oops %s' % exc)
def submit_attachment(url, message, attachments): click.echo('running against %s!' % url) # files = [('attachments', (attachment, open(path.abspath(attachment)))) for attachment in attachments] browser = TestApp(url) submit_page = browser.get('/briefkasten/') submit_form = submit_page.forms['briefkasten-form'] submit_form['message'] = u'Hello there' try: response = submit_form.submit() import pdb pdb.set_trace() click.echo(u'Got %s' % response.url) except AppError as exc: click.echo(u'Oops %s' % exc)
def test_permission_for_specs(simple_config, route, permission, status) -> None: """Allow (200) or deny (403) access to the spec/explorer view.""" with tempfile.NamedTemporaryFile() as document: document.write(OPENAPI_YAML.encode()) document.seek(0) simple_config.pyramid_openapi3_spec( document.name, route="/api/v1/openapi.yaml", route_name="api_spec", permission=permission, ) simple_config.pyramid_openapi3_add_explorer( route="/api/v1/", route_name="api_explorer", permission=permission, ) simple_config.add_route("foo", "/foo") testapp = TestApp(simple_config.make_wsgi_app()) testapp.get(route, status=status)
class DummyAppProxy(): """The wrapper for actual dummy app. Adds `switch_target()` to change subdomain via extra_environ. """ def __init__(self, extra_environ) -> None: self.extra_environ = extra_environ self._app = None self._format() # default example.org (not console.example.org) def _format(self, subdomain=None) -> None: if self._app is None: self._app = TestApp(router, extra_environ=self.extra_environ) domain = self.extra_environ['SERVER_NAME'] if subdomain is not None: domain = ('{}.' + domain).format(subdomain) # replace self._app.extra_environ = new_extra_environ(domain) else: self._app.extra_environ = new_extra_environ(domain) def switch_target(self, target=None) -> 'self': """Target subdomain switch utility method. >>> app = dummy_app.switch_target('console') >>> app.get('/', status=200) """ self._format(subdomain=target) return self @property def app(self): return self._app.app def get(self, *args, **kwargs): return self._app.get(*args, **kwargs) def post(self, *args, **kwargs): return self._app.post(*args, **kwargs)
def test_path_parameter_validation() -> None: """Test validated parameters in context factory.""" with NamedTemporaryFile() as tempdoc: tempdoc.write( b"""\ openapi: "3.0.0" info: version: "1.0.0" title: Foo API paths: /foo/{foo_id}: parameters: - name: foo_id in: path required: true schema: type: integer get: responses: 200: description: A foo """ ) tempdoc.seek(0) with Configurator() as config: config.include("pyramid_openapi3") config.pyramid_openapi3_spec(tempdoc.name) config.pyramid_openapi3_register_routes() config.add_route("foo_route", "/foo/{foo_id}", factory=_FooResource) config.add_view(_foo_view, route_name="foo_route", renderer="json") app = config.make_wsgi_app() test_app = TestApp(app) resp = test_app.get("/foo/1") assert resp.json == 1
class QuizPageTestCase(DatastoreBaseCase): def setUp(self): super(QuizPageTestCase, self).setUp() q1 = Question( question='Test Question 1', answers={ 'A': 'First Answer', 'B': 'Second Answer' }, correct_answer='B') q2 = Question( question='Test Question 2', answers={ 'A': 'An Answer', 'B': 'Another Answer' }, correct_answer='A') q3 = Question( question='Test Question 3', answers={ 'A': 'Alpha', 'B': 'Bravo', 'C': 'Charlie' }, correct_answer='C') q4 = Question( question='Test Question 4', answers={ 'A': 'Good Luck' }, correct_answer='B') Quiz( questions=[q1, q2], code=8675309, name='Test Quiz 1', userid='test.user-ID').put() Quiz( questions=[q3], code=1234, name='Test Quiz 2', userid='test.user-ID').put() Quiz( questions=[q4], code=5678, name='Test Quiz 3', userid='another.user-ID').put() self.app = TestApp(application) def test_get(self): self.login(**DatastoreBaseCase.DEFAULT_USER) resp = self.app.get('/quizzes') resp.mustcontain( '<h1>Quizzes</h1>', 'Test Quiz 1', 'Test Quiz 2', no=[ 'Test Quiz 3']) def test_get_login_required(self): resp = self.app.get('/quizzes', status=302) resp.mustcontain( no=[ '<h1>Quizzes</h1>', 'Test Quiz 1', 'Test Quiz 2', 'Test Quiz 3'])
class CreatePageTestCase(DatastoreBaseCase): def setUp(self): super(CreatePageTestCase, self).setUp() self.app = TestApp(application) def test_get(self): self.login(**DatastoreBaseCase.DEFAULT_USER) resp = self.app.get('/create') resp.mustcontain( '<h1>Create a Quiz</h1>') def test_get_login_required(self): resp = self.app.get('/create', status=302) resp.mustcontain(no=[ '<h1>Create a Quiz</h1>']) def test_post(self): self.login(**DatastoreBaseCase.DEFAULT_USER) self.app.post('/create', params=json.dumps({ 'name': 'Test Quiz', 'questions': [ { 'question': 'Test Question 1', 'answers': { 'A': 'First Answer', 'B': 'Second Answer' }, 'correctAnswer': 'B' }, { 'question': 'Test Question 2', 'answers': { 'A': 'An Answer', 'B': 'Another Answer' }, 'correctAnswer': 'A' } ] })) user_id = DatastoreBaseCase.DEFAULT_USER['user_id'] result = Quiz.query(Quiz.userid == user_id).fetch()[0] self.assertDictEqual(result.dict, { 'questions': [ { 'question': 'Test Question 1', 'answers': { 'A': 'First Answer', 'B': 'Second Answer'} }, { 'question': 'Test Question 2', 'answers': { 'A': 'An Answer', 'B': 'Another Answer'}, } ], 'code': None, 'name': 'Test Quiz', 'userid': user_id }) def test_post_login_required(self): self.app.post('/create', status=401) user_id = DatastoreBaseCase.DEFAULT_USER['user_id'] quizes = Quiz.query(Quiz.userid == user_id).fetch() self.assertEqual(len(quizes), 0)
class SacrudTests(BaseSacrudTest): def setUp(self): request = testing.DummyRequest() config = testing.setUp(request=request) config.registry.settings['sqlalchemy.url'] = "sqlite:///:memory:" config.include('sacrud.pyramid_ext') settings = config.registry.settings settings['sacrud_models'] = (User, Profile) config.scan() from sacrud.pyramid_ext import DBSession engine = create_engine('sqlite:///:memory:') DBSession.configure(bind=engine) self.session = DBSession # To create tables, you typically do: #User.metadata.create_all(engine) User.metadata.create_all(engine) Profile.metadata.create_all(engine) self.app = config.make_wsgi_app() self.testapp = TestApp(self.app) def tearDown(self): def clear_files(): for filename in glob.glob("%s/*.html" % (PHOTO_PATH, )): os.remove(os.path.join(PHOTO_PATH, filename)) clear_files() self.session.remove() testing.tearDown() def test_home_view(self): self.user_add() request = testing.DummyRequest() name = route_url('sa_home', request) response = self.testapp.get(name) self.failUnlessEqual(response.status, '200 OK') self.failUnlessEqual("Tables" in response, True) self.failUnlessEqual("user" in response, True) self.failUnlessEqual("profile" in response, True) def test_list_view(self): user = self.user_add() self.profile_add(user) request = testing.DummyRequest() name = route_url('sa_list', request, table="user") response = self.testapp.get(name) self.failUnlessEqual(response.status, '200 OK') name = route_url('sa_list', request, table="profile") response = self.testapp.get(name) self.failUnlessEqual(response.status, '200 OK') def test_read_view(self): user = self.user_add() self.profile_add(user) request = testing.DummyRequest() name = route_url('sa_read', request, table="user", id="1") response = self.testapp.get(name) self.failUnlessEqual(response.status, '200 OK') name = route_url('sa_read', request, table="profile", id="1") response = self.testapp.get(name) self.failUnlessEqual(response.status, '200 OK') def test_create_view(self): request = testing.DummyRequest() name = route_url('sa_create', request, table="user") response = self.testapp.get(name) self.failUnlessEqual(response.status, '200 OK') form = response.form form['name'] = "Karlson" form['fullname'] = "Karlson the Third" form['password'] = 123 response = form.submit("form.submitted").follow() self.failUnlessEqual(response.status, '200 OK') user = self.session.query(User).get(1) self.assertFalse(user is None) self.assertEqual(user.name, "Karlson") self.assertEqual(user.fullname, "Karlson the Third") self.assertEqual(user.password, "123") self.assertEqual(user.position, 0) name = route_url('sa_create', request, table="profile") response = self.testapp.get(name) form = response.form form['user_id'] = "1" form['phone'] = "123" form['cv'] = "Karlson live on the roof" field = form.get('married', index=0) field.checked = False form['salary'] = "200.23" upload = Upload('filename.txt', 'data') form['photo'] = upload response = form.submit("form.submitted").follow() self.failUnlessEqual(response.status, '200 OK') profile = self.session.query(Profile).get(1) self.assertFalse(profile is None) self.assertEqual(profile.user.id, 1) self.assertEqual(profile.phone, "123") self.assertEqual(profile.cv, "Karlson live on the roof") self.assertEqual(profile.married, False) self.assertEqual(profile.salary, 200.23) def test_update_view(self): user = self.user_add() self.profile_add(user) request = testing.DummyRequest() name = route_url('sa_update', request, table="user", id="1") response = self.testapp.get(name) self.failUnlessEqual(response.status, '200 OK') form = response.form form['name'] = "Karlson" form['fullname'] = "Karlson the Third" form['password'] = 123 response = form.submit("form.submitted").follow() self.failUnlessEqual(response.status, '200 OK') user = self.session.query(User).get(1) self.assertFalse(user is None) self.assertEqual(user.name, "Karlson") self.assertEqual(user.fullname, "Karlson the Third") self.assertEqual(user.password, "123") name = route_url('sa_update', request, table="profile", id="1") response = self.testapp.get(name) form = response.form form['user_id'] = "1" form['phone'] = "123" form['cv'] = "Karlson live on the roof" field = form.get('married', index=0) field.checked = False form['salary'] = "200.23" upload = Upload('filename.txt', 'data') form['photo'] = upload response = form.submit("form.submitted").follow() self.failUnlessEqual(response.status, '200 OK') profile = self.session.query(Profile).get(1) self.assertFalse(profile is None) self.assertEqual(profile.user.id, 1) self.assertEqual(profile.phone, "123") self.assertEqual(profile.cv, "Karlson live on the roof") self.assertEqual(profile.married, False) self.assertEqual(profile.salary, 200.23) def test_delete_view(self): user = self.user_add() self.profile_add(user) request = testing.DummyRequest() name = route_url('sa_delete', request, table="profile", id=1) response = self.testapp.get(name).follow() self.failUnlessEqual(response.status, '200 OK') name = route_url('sa_delete', request, table="user", id=1) response = self.testapp.get(name).follow() self.failUnlessEqual(response.status, '200 OK') def test_paste_view(self): self.user_add() self.user_add() request = testing.DummyRequest() user1 = self.session.query(User).get(1) user2 = self.session.query(User).get(2) self.assertGreater(user1.position, user2.position) name = route_url('sa_paste', request, table="user", id=2, target_id=1) response = self.testapp.post(name).follow() self.failUnlessEqual(response.status, '200 OK') user1 = self.session.query(User).get(1) user2 = self.session.query(User).get(2) self.assertGreater(user2.position, user1.position)
def get_analysis(webapp: app.TestApp, string: Optional[str] = None) -> TestResponse: if string is None: string = _GET_PARSE_STRING return webapp.get("/analysis", {"string": string})
def test_get_root_should_be_accessible(webapp: app.TestApp): response = webapp.get("/") assert response.status_code == 200
def test_get_analysis_requires_string_parameter(webapp: app.TestApp): with pytest.raises(app.AppError): webapp.get("/analysis")