예제 #1
0
def test_repository():
    source = load_json('source/repository.json')
    expectation = load_json('correct/repository.json')

    actual_result = [Repository(**x).to_dict() for x in source]

    assert actual_result == expectation
def test_check(app, client):
    set_single_scrapyd(app)
    data = {
        'project': PROJECT,
        '_version': VERSION,
        'spider': SPIDER,
        'jobid': JOBID,
        'USER_AGENT': 'chrome',
        'COOKIES_ENABLED': 'False',
        'ROBOTSTXT_OBEY': 'False',
        'CONCURRENT_REQUESTS': '1',
        'DOWNLOAD_DELAY': '2',
        'additional': '-d setting=CLOSESPIDER_TIMEOUT=60 \r\n-d setting=CLOSESPIDER_PAGECOUNT=10 \r\n-d arg1=val1'
    }

    data_ = {
        'project': PROJECT,
        '_version': DEFAULT_LATEST_VERSION,
        'spider': SPIDER,
        'additional': '-d setting=CLOSESPIDER_TIMEOUT=60 -d arg1'
    }
    with app.test_request_context():
        url = url_for('schedule.check', node=1)
        response = client.post(url, data=data)
        # js = response.get_json()
        js = load_json(response)
        assert js['filename'] == '%s_%s_%s.pickle' % (PROJECT, VERSION, SPIDER)

        response = client.post(url, data=data_)
        js = load_json(response)
        assert js['filename'] == '%s_%s_%s.pickle' % (PROJECT, 'default-the-latest-version', SPIDER)
예제 #3
0
파일: test_api.py 프로젝트: wung/scrapydweb
def test_delversion(app, client):
    with app.test_request_context():
        url = url_for('api', node=1, opt='delversion', project=PROJECT, version_spider_job=VERSION)
        response = client.get(url)
        js = load_json(response)
        assert ((js['status'] == OK and 'delversion.json' in js['url']) or
                (js['status'] == ERROR and '%s.egg' % VERSION in js['message']))
예제 #4
0
파일: test_api.py 프로젝트: wung/scrapydweb
def test_delproject(app, client):
    with app.test_request_context():
        url = url_for('api', node=1, opt='delproject', project=PROJECT)
        response = client.get(url)
        js = load_json(response)
        assert ((js['status'] == OK and 'delproject.json' in js['url']) or
                (js['status'] == ERROR and PROJECT in js['message']))
예제 #5
0
def test_get_token(url, data, expected, status_code, client, monkeypatch):
    monkeypatch.setattr('app.mod_api.views.current_app.facilities',
                        {'wolfsburg': {}})

    rv = client.post(url, data=json.dumps(data),
                     headers={'content-type': 'application/json'})

    assert rv.status_code == status_code

    if expected is not True:
        assert load_json(rv.data) == expected

    else:
        token = load_json(rv.data)['token']

        assert data == verify_token(token)
예제 #6
0
    def test_basic(self, db_session: Session) -> None:
        """Check creating a basic job works as expected."""
        job_service = get_configured_job_service(db_session, files=False)
        user = get_random_user()

        job_data = load_json('pg')
        # here: Job is added to database but dag file is not created (mocked away, as it happens in a separate pkg)
        result = job_service.create(user=user, **job_data)

        assert result['status'] == 'success'
        assert result['code'] == 201
        assert result['headers']['Location'].startswith('jobs/jb-')
        assert result['headers']['OpenEO-Identifier'].startswith('jb-')
        results_job_id = result['headers']['OpenEO-Identifier']
        assert results_job_id == result['headers']['Location'][5:]
        assert db_session.query(Job).filter(Job.user_id == user["id"]).filter(
            Job.id == results_job_id).count() == 1
        dag_handler = DagHandler()
        assert not isfile(
            dag_handler.get_dag_path_from_id(
                dag_handler.get_preparation_dag_id(
                    job_id=result['headers']['OpenEO-Identifier'])))

        job_service.processes_service.put_user_defined.assert_called_once_with(
            user=user, process_graph_id="pg_id", **job_data["process"])
예제 #7
0
def test_parser():
    with open(f'{BASE_DIR}/fixtures/source/maillog') as fd:
        logs = fd.read().splitlines()
    expectation = load_json('correct/parsed_maillog.json')

    actual_results = [parse(log) for log in logs]

    assert actual_results == expectation
예제 #8
0
def test_schedule_xhr(app, client):
    with app.test_request_context():
        url = url_for('schedule.schedule_xhr',
                      node=2,
                      filename='%s_%s_%s.pickle' % (PROJECT, VERSION, SPIDER))
        response = client.post(url)
        js = load_json(response)
        assert js['status'] == ERROR
예제 #9
0
파일: test_api.py 프로젝트: wung/scrapydweb
def test_stop(app, client):
    upload_file_deploy(app, client, filename='demo.egg', project=PROJECT, redirect_project=PROJECT)

    with app.test_request_context():
        url = url_for('api', node=1, opt='stop', project=PROJECT, version_spider_job=JOBID)
        response = client.get(url)
        js = load_json(response)
        assert js['status'] == OK and 'prevstate' in js and 'times' not in js  # js['prevstate'] == 'running'
def test_schedule_xhr(app, client):
    set_single_scrapyd(app)
    with app.test_request_context():
        url = url_for('schedule.schedule_xhr', node=1, filename='%s_%s_%s.pickle' % (PROJECT, VERSION, SPIDER))
        response = client.post(url)
        js = load_json(response)
        assert js['status'] == OK and js['jobid'] == JOBID

        client.get(url_for('api', node=1, opt='forcestop', project=PROJECT, version_spider_job=JOBID))
예제 #11
0
    def result(self):
        if self._result is None:
            path = self.base + ".result.json"
            if not os.path.isfile(path):
                pytest.xfail(
                    f"Result JSON does not exist for test {self.category}/{self.name}"
                )

            self._result = load_json(path)
        return self._result
예제 #12
0
def test_valid_token(url, status_code, data, flask_app):

    @flask_app.route('/<facility>/valid')
    @valid_token
    def valid(facility):
        return jsonify({'access': True})

    rv = flask_app.test_client().get(url)

    assert rv.status_code == status_code
    assert load_json(rv.data) == data
예제 #13
0
def test_deploy_xhr(app, client):
    with app.test_request_context():
        eggname = '%s_%s_from_file_demo.egg' % (PROJECT, VERSION)
        url = url_for('deploy.deploy_xhr',
                      node=1,
                      eggname=eggname,
                      project=PROJECT,
                      version=VERSION)
        response = client.post(url)
        js = load_json(response)
        assert js['status'] == OK and js['project'] == PROJECT
예제 #14
0
    def bench(self):
        if self._bench is None:
            path = self.base + ".bench.json"
            if not os.path.isfile(path):
                pytest.xfail(
                    f"Benchmark JSON does not exist for test {self.category}/{self.name}"
                )

            self._result = load_json(path)

        return self._bench
예제 #15
0
def test_check(app, client):
    data = {
        'project': PROJECT,
        '_version': VERSION,
        'spider': SPIDER,
        'jobid': JOBID
    }
    with app.test_request_context():
        url = url_for('schedule.check', node=2)
        response = client.post(url, data=data)
        js = load_json(response)
        assert js['filename'] == '%s_%s_%s.pickle' % (PROJECT, VERSION, SPIDER)
예제 #16
0
def test_api_forcestop(app, client):
    with app.test_request_context():
        url = url_for('api',
                      node=1,
                      opt='forcestop',
                      project=PROJECT,
                      version_spider_job=jobid,
                      ui='simple')
        response = client.get(url)
        js = load_json(response)
        assert js['status'] == OK and js['prevstate'] is None and js[
            'times'] == 2
예제 #17
0
def test_writer(writer: Type[FileWriter], fmt: str, answer_filename: str):
    output_filename_for_test = 'dummy'
    records = load_json('source/records.json')
    obj = writer(filepath=output_filename_for_test)
    obj.handle(records)

    expected_filepath = f'{output_filename_for_test}.{fmt}'
    assert obj.filepath == expected_filepath

    is_same = is_same_file_contents(
        obj.filepath, f'{BASE_DIR}/fixtures/correct/{answer_filename}')
    remove_file(expected_filepath)
    assert is_same is True
예제 #18
0
def test_lent_list(lent_return, expected, client, monkeypatch):
    monkeypatch.setattr('app.mod_api.views.current_app.facilities',
                        {
                            'wolfsburg': {
                                'lent_list': lambda x, y: lent_return
                            }
                        })

    rv = client.get(
        ('/api/wolfsburg/lent?token='
         'eyJwYXNzd29yZCI6ImJhciIsInVzZXJuYW1lIjoiZm9vIn0.'
         'pIUBfh1BSvoROF8wgHsebtQyFK8'))

    assert load_json(rv.data) == expected
예제 #19
0
def test_search(search_return, expected, client, monkeypatch):
    monkeypatch.setattr(
        'app.mod_api.views.current_app.facilities',
        {
            'wolfsburg': {
                'search': lambda term, page: search_return
            }
        })

    rv = client.post('/api/wolfsburg/search',
                     data=json.dumps({'term': 'batman'}),
                     headers={'content-type': 'application/json'})

    assert load_json(rv.data) == expected
예제 #20
0
def test_api_stop(app, client):
    sleep()

    with app.test_request_context():
        url = url_for('api',
                      node=1,
                      opt='stop',
                      project=PROJECT,
                      version_spider_job=jobid,
                      ui='mobile')
        response = client.get(url)
        js = load_json(response)
        assert js['status'] == OK and js[
            'prevstate'] == 'running' and 'times' not in js
예제 #21
0
def test_valid_facility(facility, status_code, data, flask_app, monkeypatch):

    class MockApp(object):
        facilities = {'wolfsburg': {}}

    monkeypatch.setattr('app.mod_api.decorators.current_app', MockApp)

    @flask_app.route('/<facility>/valid')
    @valid_facility
    def valid(facility):
        return jsonify({'access': True})

    rv = flask_app.test_client().get('/{}/valid'.format(facility))

    assert rv.status_code == status_code
    assert load_json(rv.data) == data
예제 #22
0
def test_facility_list(client, monkeypatch):
    monkeypatch.setattr('app.mod_api.views.current_app.facilities',
                        {
                            'wolfsburg': {'metadata': {}},
                            'nuernberg': {'metadata': {}},
                            'paris': {'metadata': {}}
                        })

    rv = client.get('/api/facilities')

    assert rv.status_code == 200

    data = load_json(rv.data)

    assert len(data['facilities']) == 3
    assert 'wolfsburg' in data['facilities']
    assert 'nuernberg' in data['facilities']
    assert 'paris' in data['facilities']
예제 #23
0
def test_check(app, client):
    data = {
        'project':
        PROJECT,
        '_version':
        VERSION,
        'spider':
        SPIDER,
        'jobid':
        JOBID,
        'additional':
        "-d setting=CLOSESPIDER_TIMEOUT=10 \r\n-d setting=CLOSESPIDER_PAGECOUNT=1 \r\n-d arg1=val1",
    }
    with app.test_request_context():
        url = url_for('schedule.check', node=1)
        response = client.post(url, data=data)
        # js = response.get_json()
        js = load_json(response)
        assert js['filename'] == '%s_%s_%s.pickle' % (PROJECT, VERSION, SPIDER)
예제 #24
0
def test_api_start(app, client):
    global jobid
    upload_file_deploy(app,
                       client,
                       filename='demo.egg',
                       project=PROJECT,
                       redirect_project=PROJECT)

    with app.test_request_context():
        url = url_for('api',
                      node=1,
                      opt='start',
                      project=PROJECT,
                      version_spider_job=SPIDER,
                      ui='mobile')
        response = client.get(url)
        js = load_json(response)
        jobid = js['jobid']
        assert js['status'] == OK and js['jobid']
예제 #25
0
파일: test_log.py 프로젝트: wung/scrapydweb
def test_log_utf8_stats(app, client):
    upload_file_deploy(app, client, filename='demo.egg', project=PROJECT, redirect_project=PROJECT)

    with app.test_request_context():
        url = url_for('api', node=1, opt='start', project=PROJECT, version_spider_job=SPIDER)
        response = client.get(url)
        js = load_json(response)
        jobid = js['jobid']

        sleep()

        # UTF8 page
        url = url_for('log', node=1, opt='utf8', project=PROJECT, spider=SPIDER, job=jobid)
        response = client.get(url)
        assert 'utf8 - ScrapydWeb' in get_text(response) and not is_simple_ui(response)

        client.get(url_for('api', node=1, opt='forcestop', project=PROJECT, version_spider_job=jobid))

        # Stats page
        url = url_for('log', node=1, opt='stats', project=PROJECT, spider=SPIDER, job=jobid)
        response = client.get(url)
        assert 'Stats collection' in get_text(response) and not is_simple_ui(response)
예제 #26
0
    def test_start_processing_sync_job(self, db_session: Session) -> None:
        """Check process_sync works as expected."""
        job_service = get_configured_job_service(db_session)
        user = get_random_user()

        job_data = load_json('pg')
        _ = job_data.pop("title")
        _ = job_data.pop("description")

        result = job_service.process_sync(user=user, **job_data)

        assert result['status'] == 'success'
        assert 'result/sample-output.tif' in result['file']
        _ = result.pop('file')
        assert result == {
            'code': 200,
            'status': 'success',
            'headers': {
                'Content-Type': 'image/tiff',
                'OpenEO-Costs': 0
            }
        }
예제 #27
0
def test_email(app, client):
    with app.test_request_context():
        if not app.config.get('ENABLE_EMAIL', False):
            return

        # Simulate caching post 'Finished'
        url = url_for('api',
                      node=1,
                      opt='start',
                      project=PROJECT,
                      version_spider_job=SPIDER)
        response = client.get(url)
        js = load_json(response)
        jobid = js['jobid']

        sleep()
        url = url_for('log',
                      node=1,
                      opt='stats',
                      project=PROJECT,
                      spider=SPIDER,
                      job=jobid,
                      job_finished='True')
        response = client.post(url, content_type='multipart/form-data')
        assert 'Stats collection' in get_text(response)
        client.get(
            url_for('api',
                    node=1,
                    opt='forcestop',
                    project=PROJECT,
                    version_spider_job=jobid))

        # Simulate caching post 'ForceStopped'
        app.config['ON_JOB_FINISHED'] = False
        url = url_for('api',
                      node=1,
                      opt='start',
                      project=PROJECT,
                      version_spider_job=SPIDER)
        response = client.get(url)
        js = load_json(response)
        jobid = js['jobid']

        sleep()
        url = url_for('log',
                      node=1,
                      opt='stats',
                      project=PROJECT,
                      spider=SPIDER,
                      job=jobid,
                      job_finished='')
        response = client.post(url, content_type='multipart/form-data')
        assert 'Stats collection' in get_text(response)
        client.get(
            url_for('api',
                    node=1,
                    opt='forcestop',
                    project=PROJECT,
                    version_spider_job=jobid))

        # Simulate caching post 'Stopped'
        app.config['LOG_CRITICAL_THRESHOLD'] = 0
        app.config['LOG_REDIRECT_THRESHOLD'] = 1
        app.config['LOG_REDIRECT_TRIGGER_STOP'] = True
        url = url_for('api',
                      node=1,
                      opt='start',
                      project=PROJECT,
                      version_spider_job=SPIDER)
        response = client.get(url)
        js = load_json(response)
        jobid = js['jobid']

        sleep()
        url = url_for('log',
                      node=1,
                      opt='stats',
                      project=PROJECT,
                      spider=SPIDER,
                      job=jobid,
                      job_finished='')
        response = client.post(url, content_type='multipart/form-data')
        assert 'Stats collection' in get_text(response)
        client.get(
            url_for('api',
                    node=1,
                    opt='forcestop',
                    project=PROJECT,
                    version_spider_job=jobid))

        # Simulate caching post 'Triggered'
        app.config['LOG_REDIRECT_THRESHOLD'] = 0
        app.config['LOG_IGNORE_THRESHOLD'] = 1

        url = url_for('api',
                      node=1,
                      opt='start',
                      project=PROJECT,
                      version_spider_job=SPIDER)
        response = client.get(url)
        js = load_json(response)
        jobid = js['jobid']

        sleep()
        url = url_for('log',
                      node=1,
                      opt='stats',
                      project=PROJECT,
                      spider=SPIDER,
                      job=jobid,
                      job_finished='')
        response = client.post(url, content_type='multipart/form-data')
        assert 'Stats collection' in get_text(response)
        client.get(
            url_for('api',
                    node=1,
                    opt='forcestop',
                    project=PROJECT,
                    version_spider_job=jobid))

        # Simulate caching post 'Running'
        app.config['LOG_IGNORE_THRESHOLD'] = 0
        app.config['ON_JOB_RUNNING_INTERVAL'] = 5

        url = url_for('api',
                      node=1,
                      opt='start',
                      project=PROJECT,
                      version_spider_job=SPIDER)
        response = client.get(url)
        js = load_json(response)
        jobid = js['jobid']

        # Would NOT trigger email
        sleep()
        url = url_for('log',
                      node=1,
                      opt='stats',
                      project=PROJECT,
                      spider=SPIDER,
                      job=jobid,
                      job_finished='')
        response = client.post(url, content_type='multipart/form-data')
        assert 'Stats collection' in get_text(response)

        # Would trigger email
        sleep()
        url = url_for('log',
                      node=1,
                      opt='stats',
                      project=PROJECT,
                      spider=SPIDER,
                      job=jobid,
                      job_finished='')
        response = client.post(url, content_type='multipart/form-data')
        assert 'Stats collection' in get_text(response)

        # Would NOT trigger email
        app.config['ON_JOB_RUNNING_INTERVAL'] = 0
        sleep()
        url = url_for('log',
                      node=1,
                      opt='stats',
                      project=PROJECT,
                      spider=SPIDER,
                      job=jobid,
                      job_finished='')
        response = client.post(url, content_type='multipart/form-data')
        assert 'Stats collection' in get_text(response)
        client.get(
            url_for('api',
                    node=1,
                    opt='forcestop',
                    project=PROJECT,
                    version_spider_job=jobid))
예제 #28
0
파일: test_api.py 프로젝트: wung/scrapydweb
def test_listprojects(app, client):
    with app.test_request_context():
        url = url_for('api', node=1, opt='listprojects')
        response = client.get(url)
        js = load_json(response)
        assert js['status'] == OK and 'projects' in js
예제 #29
0
파일: test_api.py 프로젝트: wung/scrapydweb
def test_daemonstatus(app, client):
    with app.test_request_context():
        url = url_for('api', node=1, opt='daemonstatus')
        response = client.get(url)
        js = load_json(response)
        assert js['status'] == OK and 'running' in js
예제 #30
0
def compact_arbor(reference_dir):
    return load_json(reference_dir, "compact-arbor")
예제 #31
0
def compact_skeleton(reference_dir):
    return load_json(reference_dir, "compact-skeleton")
예제 #32
0
파일: test_api.py 프로젝트: wung/scrapydweb
def listspiders(app, client, version):
    with app.test_request_context():
        url = url_for('api', node=1, opt='listspiders', project=PROJECT, version_spider_job=version)
        response = client.get(url)
        js = load_json(response)
        assert js['status'] == OK and SPIDER in js['spiders']
예제 #33
0
 def json(self):
     return load_json(self._path)
예제 #34
0
파일: test_api.py 프로젝트: wung/scrapydweb
def test_listjobs(app, client):
    with app.test_request_context():
        url = url_for('api', node=1, opt='listjobs', project=PROJECT)
        response = client.get(url)
        js = load_json(response)
        assert js['status'] == OK and 'listjobs.json' in js['url']
예제 #35
0
 def setUp(self) -> None:
     """Instantiate TemporalToSnapshot"""
     self.resp = load_json("testData/nfl-week-three.json")
     self.line_event = LinesEventFacade(self.resp.get("events")[0])
     self.test_ttss = TemporalToSnapshot()
예제 #36
0
def test_log_utf8_stats(app, client):
    upload_file_deploy(app,
                       client,
                       filename='demo.egg',
                       project=PROJECT,
                       redirect_project=PROJECT)

    with app.test_request_context():
        url = url_for('api',
                      node=1,
                      opt='start',
                      project=PROJECT,
                      version_spider_job=SPIDER)
        response = client.get(url)
        js = load_json(response)
        jobid = js['jobid']

        sleep()

        # Log page
        url = url_for('log',
                      node=1,
                      opt='utf8',
                      project=PROJECT,
                      spider=SPIDER,
                      job=jobid)
        response = client.get(url)
        assert 'log - ScrapydWeb' in get_text(
            response) and not is_mobileui(response)

        # Stats page
        url = url_for('log',
                      node=1,
                      opt='stats',
                      project=PROJECT,
                      spider=SPIDER,
                      job=jobid)
        response = client.get(url)
        assert 'Stats collection' in get_text(
            response) and not is_mobileui(response)

        # Dashboard page
        url = url_for('dashboard', node=1)
        response = client.get(url)
        url_stop = url_for('api',
                           node=1,
                           opt='stop',
                           project=PROJECT,
                           version_spider_job=jobid)
        assert url_stop in get_text(response)

        client.get(
            url_for('api',
                    node=1,
                    opt='forcestop',
                    project=PROJECT,
                    version_spider_job=jobid))

        # /1/schedule/ScrapydWeb-demo/default:%20the%20latest%20version/test/
        response = client.get(url)
        url_start = url_for('schedule.schedule',
                            node=1,
                            project=PROJECT,
                            version=DEFAULT_LATEST_VERSION,
                            spider=SPIDER)
        assert url_start in get_text(response)