def test_upload_multiple(db_session, client): john = users.john() db_session.add(john) db_session.commit() data = MultiDict() data.add("pilotName", "JD ") data.add("files", (igcs.simple_path,)) data.add("files", (igcs.hornet_path,)) res = client.post("/flights/upload", headers=auth_for(john), data=data) assert res.status_code == 200 assert res.json == S( { u"club_members": [], u"aircraft_models": [], u"results": ExactSequence( [ { u"status": 0, u"cacheKey": text_type, u"flight": Partial( { u"club": None, u"copilot": None, u"copilotName": None, u"distance": 7872, u"igcFile": dict, u"pilot": None, u"pilotName": "JD", } ), u"name": Match(r".*simple\.igc"), u"trace": dict, u"airspaces": [], }, { u"status": 0, u"cacheKey": text_type, u"flight": Partial( { u"club": None, u"copilot": None, u"copilotName": None, u"distance": 171246, u"igcFile": dict, u"pilot": None, u"pilotName": "JD", } ), u"name": Match(r".*2018-04-14-fla-6ng-01\.igc"), u"trace": dict, u"airspaces": [], }, ] ), } )
def test_upload_with_weglide(db_session, client): john = users.john() db_session.add(john) db_session.commit() data = dict( pilotId=john.id, weglideUserId="123", weglideBirthday="2020-01-07", files=(igcs.simple_path,), ) with patch.object(tasks.upload_to_weglide, "delay", return_value=None) as mock: res = client.post("/flights/upload", headers=auth_for(john), data=data) mock.assert_called_once() assert len(mock.call_args.args) == 3 assert mock.call_args.args[1] == 123 assert mock.call_args.args[2] == "2020-01-07" assert res.status_code == 200 assert res.json == S( { u"club_members": list, u"aircraft_models": list, u"results": ExactSequence( [ { u"status": 0, u"cacheKey": IsTrue(), u"flight": Partial( { u"club": None, u"copilot": None, u"copilotName": None, u"distance": 7872, u"igcFile": Partial( { u"weglideStatus": 1, u"weglideData": None, } ), u"pilotName": None, u"pilot": { u"id": john.id, u"name": john.name, }, } ), u"name": Match(r".*simple.igc"), u"trace": dict, u"airspaces": [], } ] ), } )
# directory and using forward slashes even on Windows Required('script'): text_type, # Additional paths to look for mozharness configs in. These should be # relative to the base of the source checkout Optional('config-paths'): [text_type], # the config files required for the task, relative to # testing/mozharness/configs or one of the paths specified in # `config-paths` and using forward slashes even on Windows Required('config'): [text_type], # any additional actions to pass to the mozharness command Optional('actions'): [ Match('^[a-z0-9-]+$', "actions must be `-` seperated alphanumeric strings") ], # any additional options (without leading --) to be passed to mozharness Optional('options'): [ Match( '^[a-z0-9-]+(=[^ ]+)?$', "options must be `-` seperated alphanumeric strings (with optional argument)" ) ], # --custom-build-variant-cfg value Optional('custom-build-variant-cfg'): text_type, # Extra configuration options to pass to mozharness.
from core.users.models import User from core.users.permissions import UserPermissions from core.utils import require_permission, validate_data from core.validators import PASSWORD_REGEX, PermissionsDict, check_permissions from . import bp app = flask.current_app MODERATE_USER_SCHEMA = Schema({ 'email': Email(), 'password': Match( PASSWORD_REGEX, msg= ('Password must be between 12 and 512 characters and contain at least 1 letter, ' '1 number, and 1 special character'), ), 'uploaded': All(int, Range(min=0, max=9223372036854775808)), 'downloaded': All(int, Range(min=0, max=9223372036854775808)), 'invites': All(int, Range(min=0, max=2147483648)), 'permissions': PermissionsDict(restrict=UserPermissions.MODERATE_ADVANCED), }) @bp.route('/users/<int:user_id>', methods=['PUT']) @require_permission(UserPermissions.MODERATE)
# $ LIVE_TESTS='alameda,san_francisco' python -m pytest -v . # LIVE_TESTS = os.getenv('LIVE_TESTS', '').lower().strip() TEST_COUNTIES: List[str] = [] if LIVE_TESTS in ('1', 't', 'true', '*', 'all'): TEST_COUNTIES = list(scrapers.keys()) elif LIVE_TESTS: TEST_COUNTIES = [ county for county in (county.strip() for county in LIVE_TESTS.split(',')) if county ] # A validator for an ISO 8601 datetime. This is really similar to # voluptuous.validators.Datetime, but it accepts time zone offsets (e.g. # `+0300`) instead of just `Z` (the short-form version of `+0000`). DatetimeIso = Match( r'^\d{4}-\d\d-\d\dT\d\d:\d\d:\d\d(.\d+)?(Z|[+\-]\d\d:?\d\d)$') @pytest.mark.parametrize('county', TEST_COUNTIES) def test_scraper_output_format_is_valid(county: str) -> None: if county not in scrapers: pytest.fail(f'Unknown county: "{county}"') try: result = scrapers[county].get_county() except Exception as error: message = (f'Cannot validate "{county}" format because it failed to ' f'scrape: {error}') warnings.warn(message) pytest.skip(message) return
def test_upload_zips(db_session, client): john = users.john() db_session.add(john) db_session.commit() data = dict(files=(igcs.zip_path, )) res = client.post("/flights/upload", headers=auth_for(john), data=data) assert res.status_code == 200 assert res.json == S({ u"club_members": list, u"aircraft_models": list, u"results": ExactSequence([ { u"status": 0, u"cacheKey": text_type, u"flight": { u"pilotName": None, u"takeoffAirport": None, u"registration": u"D-9041", u"speed": 16.25958982149639, u"id": int, u"privacyLevel": 2, u"takeoffTime": u"2018-04-14T10:13:55+00:00", u"score": 191.94581098298332, u"scoreEndTime": u"2018-04-14T13:19:19+00:00", u"copilot": None, u"timeCreated": Datetime("%Y-%m-%dT%H:%M:%S.%f+00:00"), u"scoreStartTime": u"2018-04-14T10:16:51+00:00", u"club": None, u"flightDate": u"2018-04-14T10:13:55", u"landingTime": u"2018-04-14T13:19:19+00:00", u"rawScore": 191.94581098298332, u"copilotName": None, u"pilot": None, u"distance": 171246, u"igcFile": { u"date": u"2018-04-14", u"model": u"Duo Discus (PAS)", u"registration": u"D-9041", u"competitionId": u"TH", u"filename": Match(r"2018-04-14-fla-6ng-01.*\.igc"), }, u"landingAirport": None, u"triangleDistance": 68997, u"model": None, u"competitionId": u"TH", }, u"name": u"foo/2018-04-14-fla-6ng-01.igc", u"trace": { u"barogram_h": text_type, u"igc_end_time": u"2018-04-14T13:20:31+00:00", u"enl": text_type, u"elevations_h": text_type, u"igc_start_time": u"2018-04-14T10:12:31+00:00", u"barogram_t": text_type, }, u"airspaces": [], }, { u"status": 2, u"cacheKey": None, u"flight": None, u"name": u"__MACOSX/foo/._2018-04-14-fla-6ng-01.igc", u"trace": None, u"airspaces": None, }, { u"status": 0, u"cacheKey": text_type, u"flight": { u"pilotName": None, u"takeoffAirport": None, u"registration": u"F-CAEN", u"speed": 21.54423947862587, u"id": int, u"privacyLevel": 2, u"takeoffTime": u"2017-09-02T10:43:02+00:00", u"score": 196.1458728865586, u"scoreEndTime": u"2017-09-02T13:18:11+00:00", u"copilot": None, u"timeCreated": Datetime("%Y-%m-%dT%H:%M:%S.%f+00:00"), u"scoreStartTime": u"2017-09-02T10:45:48+00:00", u"club": None, u"flightDate": u"2017-09-02T10:43:02", u"landingTime": u"2017-09-02T13:18:11+00:00", u"rawScore": 196.1458728865586, u"copilotName": None, u"pilot": None, u"distance": 195040, u"igcFile": { u"date": u"2017-09-02", u"model": None, u"registration": u"F-CAEN", u"competitionId": u"5L", u"filename": Match(r"792xaaa1.*\.igc"), }, u"landingAirport": None, u"triangleDistance": 3685, u"model": None, u"competitionId": u"5L", }, u"name": u"792xaaa1.igc", u"trace": { u"barogram_h": text_type, u"igc_end_time": u"2017-09-02T13:18:46+00:00", u"enl": text_type, u"elevations_h": text_type, u"igc_start_time": u"2017-09-02T10:38:17+00:00", u"barogram_t": text_type, }, u"airspaces": [], }, { u"status": 2, u"cacheKey": None, u"flight": None, u"name": u"__MACOSX/._792xaaa1.igc", u"trace": None, u"airspaces": None, }, ]), })
def test_upload_multiple(db_session, client): john = users.john() db_session.add(john) db_session.commit() data = MultiDict() data.add("files", (igcs.simple_path, )) data.add("files", (igcs.hornet_path, )) res = client.post("/flights/upload", headers=auth_for(john), data=data) assert res.status_code == 200 assert res.json == S({ u"club_members": [], u"aircraft_models": [], u"results": ExactSequence([ { u"status": 0, u"cacheKey": text_type, u"flight": { u"pilotName": None, u"takeoffAirport": None, u"registration": u"LY-KDR", u"speed": 30.63035019455253, u"id": int, u"privacyLevel": 2, u"takeoffTime": u"2011-06-18T09:11:23+00:00", u"score": 9.073321994774085, u"scoreEndTime": u"2011-06-18T09:15:40+00:00", u"copilot": None, u"timeCreated": Datetime("%Y-%m-%dT%H:%M:%S.%f+00:00"), u"scoreStartTime": u"2011-06-18T09:11:23+00:00", u"club": None, u"flightDate": u"2011-06-18T09:11:23", u"landingTime": u"2011-06-18T09:15:40+00:00", u"rawScore": 9.073321994774085, u"copilotName": None, u"pilot": None, u"distance": 7872, u"igcFile": { u"date": u"2011-06-18", u"model": u"ASK13", u"registration": u"LY-KDR", u"competitionId": None, u"filename": Match(r"simple.*\.igc"), }, u"landingAirport": None, u"triangleDistance": 4003, u"model": None, u"competitionId": None, }, u"name": Match(r".*simple\.igc"), u"trace": { u"barogram_h": text_type, u"igc_end_time": u"2011-06-18T09:15:40+00:00", u"enl": text_type, u"elevations_h": text_type, u"igc_start_time": u"2011-06-18T09:07:49+00:00", u"barogram_t": text_type, }, u"airspaces": [], }, { u"status": 0, u"cacheKey": text_type, u"flight": { u"pilotName": None, u"takeoffAirport": None, u"registration": u"D-9041", u"speed": 16.25958982149639, u"id": int, u"privacyLevel": 2, u"takeoffTime": u"2018-04-14T10:13:55+00:00", u"score": 191.94581098298332, u"scoreEndTime": u"2018-04-14T13:19:19+00:00", u"copilot": None, u"timeCreated": Datetime("%Y-%m-%dT%H:%M:%S.%f+00:00"), u"scoreStartTime": u"2018-04-14T10:16:51+00:00", u"club": None, u"flightDate": u"2018-04-14T10:13:55", u"landingTime": u"2018-04-14T13:19:19+00:00", u"rawScore": 191.94581098298332, u"copilotName": None, u"pilot": None, u"distance": 171246, u"igcFile": { u"date": u"2018-04-14", u"model": u"Duo Discus (PAS)", u"registration": u"D-9041", u"competitionId": u"TH", u"filename": Match(r"2018-04-14-fla-6ng-01.*\.igc"), }, u"landingAirport": None, u"triangleDistance": 68997, u"model": None, u"competitionId": u"TH", }, u"name": Match(r".*2018-04-14-fla-6ng-01\.igc"), u"trace": { u"barogram_h": text_type, u"igc_end_time": u"2018-04-14T13:20:31+00:00", u"enl": text_type, u"elevations_h": text_type, u"igc_start_time": u"2018-04-14T10:12:31+00:00", u"barogram_t": text_type, }, u"airspaces": [], }, ]), })
def test_upload(db_session, client): john = users.john() db_session.add(john) db_session.commit() data = dict(files=(igcs.simple_path, )) res = client.post("/flights/upload", headers=auth_for(john), data=data) assert res.status_code == 200 assert res.json == S({ u"club_members": list, u"aircraft_models": list, u"results": ExactSequence([{ u"status": 0, u"cacheKey": IsTrue(), u"flight": { u"pilotName": None, u"takeoffAirport": None, u"registration": u"LY-KDR", u"speed": 30.63035019455253, u"id": int, u"privacyLevel": 2, u"takeoffTime": u"2011-06-18T09:11:23+00:00", u"score": 9.073321994774085, u"scoreEndTime": u"2011-06-18T09:15:40+00:00", u"copilot": None, u"timeCreated": Datetime("%Y-%m-%dT%H:%M:%S.%f+00:00"), u"scoreStartTime": u"2011-06-18T09:11:23+00:00", u"club": None, u"flightDate": u"2011-06-18T09:11:23", u"landingTime": u"2011-06-18T09:15:40+00:00", u"rawScore": 9.073321994774085, u"copilotName": None, u"pilot": None, u"distance": 7872, u"igcFile": { u"date": u"2011-06-18", u"model": u"ASK13", u"registration": u"LY-KDR", u"competitionId": None, u"filename": Match(r"simple(_\d+)?.igc"), }, u"landingAirport": None, u"triangleDistance": 4003, u"model": None, u"competitionId": None, }, u"name": Match(r".*simple.igc"), u"trace": { u"barogram_h": u"yG?K@?????????????????????????????????????D?????EEEEIEKOIMSMIKOUWKOOOGUIEg@c@SUEKIKEEKI[]_@a@WSGYQk@", u"igc_end_time": u"2011-06-18T09:15:40+00:00", u"enl": u"??????????????????????????????????????????????????????????????????????????????????????????????", u"elevations_h": u"n}@?????????????????????????????????????????????????????????????????????????????????????????????", u"igc_start_time": u"2011-06-18T09:07:49+00:00", u"barogram_t": u"ie_AIIIIIIIIIIIIIIKIIIIKIKIIIIIIIIIIIIIIIKIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIMIIIIIIIIIIIIIIIIIIIIII", }, u"airspaces": ExactSequence([]), }]), })