This repository has been archived by the owner. It is now read-only.
Mock API for the Firefox Marketplace
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.

A mock API server for Firefox Marketplace frontend projects. This is primarily used for continuous integration tests as well as offering a solution to offline development. In other words, it allows frontend projects to not need an actual installation of the backend.


Installation Process

The Marketplace mock API is powered by Python+Flask. To install the Marketplace mock API:

curl -s | $SHELL
source ~/.profile
mkvirtualenv --no-site-packages marketplace-mock-api
workon marketplace-mock-api
pip install -r requirements.txt

This will install a Python virtualenv, Pip dependencies, and start a local server at The server also takes --host and --port arguments.


Development tips and guidelines:

  • Since our tests depend on the mock API, keep geenrated results predictable as to not have intermittent test failures.
  • To add an endpoint, look into to add a view that returns a response.
  • If you are generating a mock object, a good place to add that would be in factory/


If you wish to throttle the server to test something, an easy way is to put a time.sleep(X) into the view in

Deploying an Update

Note that you must be added to the Marketplace Stackato group. File a bug with ops (e.g., to gain access. To deploy an update to the Marketplace mock API that is running on

stackato group marketplace
stackato push --no-prompt
stackato start

If stackato push doesn't work, try stackato update. If you don't want the instance to go temporarily offline during the push:

stackato group marketplace
stackato update

You'll be asked to confirm the following:

Bind existing services to 'flue' ?  [yN]: N
Create services to bind to 'flue' ?  [yN]: N

Enter N (or hit enter) to proceed.

Additional API

To facilitate testing, some slugs will tell the mock API to return specially-altered objects that have some explicitly defined results.

  • /app/developed/ returns an app that the user is the developer of
  • /app/packaged/ returns a packaged app
  • /app/paid/ returns a premium app
  • /app/num-previews-{X}/ returns app with X number of previews
  • /app/tracking/ returns an app with predictable fields for testing UA tracking
  • /app/upsell/ returns an app with upsell information
  • /apps/rating/can_rate/ returns reviews with metadata that states the user is authorized to review the app
  • /apps/rating/cant_rate/ returns reviews with metadata that states the user is not authorized to review the app
  • /apps/rating/has_flagged/ returns reviews all marked as already flagged
  • /apps/rating/has_rated/ returns reviews with metadata that states the
  • /apps/rating/unrated/ returns empty set of reviews
  • /feed/shelf/shelf returns a shelf with the name Shelf
  • /feed/shelf/shelf-desc returns a shelf with description
  • /feed/brand/brand-grid returns a brand with grid layout
  • /feed/brand/brand-listing returns a brand with listing layout
  • /feed/collection/grouped returns promo collection of collections with background and description
  • /feed/collection/coll-promo returns a promo collection
  • /feed/collection/coll-promo-desc returns a promo collection with a description
  • /feed/collection/coll-promo-bg returns a promo collection with a background image
  • /feed/collection/coll-promo-bg-desc returns a promo collection with a background image and description
  • /feed/collection/coll-listing returns a listing collection
  • /feed/collection/coll-listing-desc returns a listing collection with a description
  • /search/?q=empty returns empty search results
  • /search/?q=num-previews-{X} returns search results where every app has X number of previews