PayPal sandbox tests used requests.post/get() with no timeout parameter.
When the CI runner at build.unturf.com cannot reach api-m.sandbox.paypal.com,
these calls block until TCP timeout (minutes), stalling all xdist workers
and causing the 1-hour CI timeout.
- Add timeout=10 to all requests calls in PayPal sandbox tests
- Add pytest-timeout with 60s default so no single test can hang the suite
The test suite was taking 30 minutes to run sequentially. With 434 tests,
parallel execution should significantly reduce CI time.
Changes:
- Add pytest-xdist to requirements-test.txt
- Update Makefile test target to use 'pytest -n auto'
- Auto mode automatically uses number of CPU cores available
Expected improvements:
- Unit tests and model tests can run fully in parallel
- Integration tests with isolated databases can run in parallel
- Overall test time should reduce to ~5-10 minutes on multi-core CI
Note: Crypto RPC tests may still be a bottleneck if they hit shared
wallet daemons, but most other tests should parallelize well.
Dead man switch activated. Good luck everyone, I wish you the best.
- BDFL
new file: .gitignore
new file: MANIFEST.in
new file: Makefile
new file: README.rst
new file: development.ini
new file: journal.rst
new file: make_post_sell/__init__.py
new file: make_post_sell/config_jinja2.py
new file: make_post_sell/lib/__init__.py
new file: make_post_sell/lib/mail.py
new file: make_post_sell/lib/mail_messages.py
new file: make_post_sell/lib/render.py
new file: make_post_sell/models/__init__.py
new file: make_post_sell/models/cart.py
new file: make_post_sell/models/cart_coupon.py
new file: make_post_sell/models/coupon.py
new file: make_post_sell/models/coupon_redemption.py
new file: make_post_sell/models/invoice.py
new file: make_post_sell/models/market.py
new file: make_post_sell/models/meta.py
new file: make_post_sell/models/price.py
new file: make_post_sell/models/product.py
new file: make_post_sell/models/shop.py
new file: make_post_sell/models/shop_search_request.py
new file: make_post_sell/models/stripe_user_shop.py
new file: make_post_sell/models/user.py
new file: make_post_sell/models/user_product.py
new file: make_post_sell/models/user_shop.py
new file: make_post_sell/request_methods.py
new file: make_post_sell/routes.py
new file: make_post_sell/scripts/__init__.py
new file: make_post_sell/scripts/alembic/README
new file: make_post_sell/scripts/alembic/env.py
new file: make_post_sell/scripts/alembic/script.py.mako
new file: make_post_sell/scripts/alembic/versions/15751f5d7a03_add_active_cart_total_in_cents_to_user_.py
new file: make_post_sell/scripts/alembic/versions/24662905655f_create_new_active_shop_id_column_on_.py
new file: make_post_sell/scripts/alembic/versions/3e1e70bfe89d_google_analytics_id.py
new file: make_post_sell/scripts/alembic/versions/4d9da43b0e86_product_visibility_column.py
new file: make_post_sell/scripts/alembic/versions/5c40dfb56179_shop_ribbon_columns.py
new file: make_post_sell/scripts/alembic/versions/6da97f2f913f_add_updated_timestamp_to_cart.py
new file: make_post_sell/scripts/alembic/versions/96f851cbab01_terms_and_privacy.py
new file: make_post_sell/scripts/alembic/versions/ab7338eaedf1_add_price_in_cents_column.py
new file: make_post_sell/scripts/alembic/versions/af28cc35ed6f_product_bundles.py
new file: make_post_sell/scripts/alembic/versions/b0d5604d9255_add_active_cart_count_to_user_table.py
new file: make_post_sell/scripts/alembic/versions/bfc4195a7f56_product_is_sellable_coluumn.py
new file: make_post_sell/scripts/alembic/versions/c4d5566ec87d_coupon_stackable_and_couponredemption.py
new file: make_post_sell/scripts/alembic/versions/e12bbe39d87e_cart_coupon_table.py
new file: make_post_sell/scripts/alembic/versions/eadd0d69e133_shop_ribbon_text_color.py
new file: make_post_sell/scripts/alembic/versions/f3aa57777025_coupon_table.py
new file: make_post_sell/scripts/alembic/versions/f882f2255cd1_add_stripe_secret_and_public_key_to_shop.py
new file: make_post_sell/scripts/alembic/versions/fd9f7e2f2b78_user_full_name.py
new file: make_post_sell/scripts/initialize_db.py
new file: make_post_sell/scripts/pshell.py
new file: make_post_sell/static/css/alerts.css
new file: make_post_sell/static/css/common.css
new file: make_post_sell/static/css/lib.css
new file: make_post_sell/static/css/mps.css
new file: make_post_sell/static/favicon.ico
new file: make_post_sell/static/js/custom.js
new file: make_post_sell/static/js/jquery-3.4.1.min.js
new file: make_post_sell/static/js/jquery.min.js
new file: make_post_sell/static/makepostsell-3.png
new file: make_post_sell/static/makepostsell.png
new file: make_post_sell/static/mps.png
new file: make_post_sell/templates/actions_new.j2
new file: make_post_sell/templates/actions_view.j2
new file: make_post_sell/templates/base.j2
new file: make_post_sell/templates/billing.j2
new file: make_post_sell/templates/cart.j2
new file: make_post_sell/templates/cart_checkout.j2
new file: make_post_sell/templates/carts.j2
new file: make_post_sell/templates/content.j2
new file: make_post_sell/templates/content_new.j2
new file: make_post_sell/templates/coupon.j2
new file: make_post_sell/templates/coupon_new.j2
new file: make_post_sell/templates/coupons.j2
new file: make_post_sell/templates/home.j2
new file: make_post_sell/templates/join-or-log-in.j2
new file: make_post_sell/templates/markup_editor.j2
new file: make_post_sell/templates/markup_renderer.j2
new file: make_post_sell/templates/product.j2
new file: make_post_sell/templates/product_edit.j2
new file: make_post_sell/templates/product_new.j2
new file: make_post_sell/templates/products.j2
new file: make_post_sell/templates/shop.j2
new file: make_post_sell/templates/shop_about.j2
new file: make_post_sell/templates/shop_new.j2
new file: make_post_sell/templates/shop_products.j2
new file: make_post_sell/templates/shop_settings.j2
new file: make_post_sell/templates/shops.j2
new file: make_post_sell/templates/snippets/csrf.j2
new file: make_post_sell/templates/snippets/flash-alerts.j2
new file: make_post_sell/templates/snippets/google-analytics.j2
new file: make_post_sell/templates/snippets/optional-javascript.j2
new file: make_post_sell/templates/snippets/ribbon.j2
new file: make_post_sell/templates/snippets/search.j2
new file: make_post_sell/templates/snippets/stripe.j2
new file: make_post_sell/templates/update-card.j2
new file: make_post_sell/templates/user_settings.j2
new file: make_post_sell/tests/__init__.py
new file: make_post_sell/tests/test_functional.py
new file: make_post_sell/tests/test_models.py
new file: make_post_sell/views/__init__.py
new file: make_post_sell/views/actions.py
new file: make_post_sell/views/authentication.py
new file: make_post_sell/views/billing.py
new file: make_post_sell/views/cart.py
new file: make_post_sell/views/content.py
new file: make_post_sell/views/coupon.py
new file: make_post_sell/views/misc.py
new file: make_post_sell/views/product.py
new file: make_post_sell/views/shop.py
new file: make_post_sell/views/user.py
new file: pytest.ini
new file: requirements-dev.txt
new file: requirements-prod.txt
new file: requirements-test.txt
new file: requirements.py3.txt
new file: requirements.txt
new file: setup.py
new file: test.ini