graycoreio/daffodil

View on GitHub
libs/product/guides/drivers.md

Summary

Maintainability
Test Coverage
# Drivers

## In-memory web API
The in-memory driver is for rapid development without the need to set up a magento/shopify/etc backend. It will mock out the service calls to get products and return fake data. 

There are a few steps to wiring up the in-memory driver:

First, you'll need to create a layer between your app and the `DaffProductInMemoryDriverModule` so that the `DaffInMemoryBackendProductService` only ever receives product-related requests. This middle layer can just be an `in-memory-web-api` service that uses the `DaffInMemoryBackendProductService` to handle database creation for products and product get requests:

```ts
@Injectable({
  providedIn: 'root'
})
export class MyAppInMemoryService implements InMemoryDbService {
  constructor(
    private productTestingService: DaffInMemoryBackendProductService,
    private myAppTestingService: MyAppTestingService
  ) {}

  parseRequestUrl(url: string, utils: RequestInfoUtilities): ParsedRequestUrl {
    return utils.parseRequestUrl(url);
  }

  post(reqInfo: any) {
    if (collectionName === 'myAppCollectionName') {
      return myAppTestingService.post(reqInfo);
    }

    return undefined;
  }

  get(reqInfo: any) {
    const collectionName = reqInfo.collectionName;
    if (collectionName === 'products') {
      return this.productTestingService.get(reqInfo);
    } else if (collectionName === 'myAppCollectionName') {
      return myAppTestingService.get(reqInfo);
    }
  }

  createDb(): MockMyAppDatabase {
    return {
      ...this.productTestingService.createDb(),
      ...myAppCreatesOtherPartsOfTheMockDatabase()
    };
  }
}

export interface MockMyAppDatabase {
  products: DaffProduct[];
  myAppCollection: MyAppCollection[];
}
```

With this, you'll have all get requests for products handled by `@daffodil/product` and all other requests handled by your `MyAppTestingService`.

The only other thing you need to do is to make the product images in `@daffodil/product/assets` available to your application, because these are the images referenced in the mocked product data. You can do this by including assets from your `node_modules` directory to your application. For example, through angular-cli:

```json
{
  "projects": {
    "myApp": {
      **,
      "architect": {
        "build": {
          **,
          "options": {
            **,
            "assets": [
              **,
              {
                "glob": "**/*",
                "input": "node_modules/@daffodil/product/assets",
                "output": "assets/"
              }
            ]
          }
        }
      }
    }
  }
}
```