Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Testování actorů #819

Open
3 of 5 tasks
rarous opened this issue Mar 21, 2022 · 7 comments
Open
3 of 5 tasks

Testování actorů #819

rarous opened this issue Mar 21, 2022 · 7 comments
Assignees
Labels
actor enhancement New feature or request javascript Pull requests that update Javascript code

Comments

@rarous
Copy link
Collaborator

rarous commented Mar 21, 2022

Pro potřeby CI a CD potřebujeme v každém actoru vytvořit npm script test, který:

  • vytvoří soubor INPUT.json asi pomocí echo '{"type":"TEST"}' > apify_storage/key_value_store/INPUT.json
  • spustí actor v test modu TEST=1 apify run -p
  • případně po sobě uklidí rm -fr apify_storage

Běh testu je primárně určen pro CI, kde je linux. Běh na Windows není prioritou.

Dále je potřeba projít všechny actory a zajistit, aby:

  • měli podporu na input.type === ActorType.TEST
  • v takovém módu proběhne scrape přednastavené input.testUrl jako default, který jde přepsat zvenku.

ENV TEST slouží k deaktivaci uploadu dat do Kebooly a data.hlidacshopu.cz

@rarous rarous added enhancement New feature or request javascript Pull requests that update Javascript code actor labels Mar 21, 2022
@junkycoder
Copy link
Contributor

Zatím jsem přidal common script pro test actora a updatnul jsem všechny actory aby jej používali.

Ještě musím vyřešit chybějící apify storage local soubory kde je i ten INPUT.json. Zkoušel jsem je vygenerovat přes apify init, ale to mění i .gitignore daného actoru. Opravim to jedoduše tak že ten chybějící INPUT vč ev. složek nad ním vytořim v to scriptu co test spouští.

@junkycoder
Copy link
Contributor

Add přednastavení input.testUrl - to by musel mít každý actor někde definovanou takovou prop. Cesta kde je INPUT.json uloženej je v gitu ignorovaná, takže na CI nikdy nebude dokud ji script pro test nevytvoří. Nevím teda kde z tohodle scriptu zjistit, jakou testUrl do generovaného INPUT.json vložit.

@rarous
Copy link
Collaborator Author

rarous commented Mar 22, 2022

@junkycoder všichni aktoři mají něco takového:

  const input = await Apify.getInput();
  const { debug = false, country = COUNTRY.CZ, type = "FULL" } = input ?? {};

a to je to místo, kde by to mělo být:

  const input = await Apify.getInput();
  const { debug = false, country = COUNTRY.CZ, type = ActorType.FULL, testUrl = "https://example.com/"} = input ?? {};

Tj. je tam default hodnota definovaná actorem a jde přepsat inputem.

@junkycoder
Copy link
Contributor

Uff, prolezl jsem všechny jen abych to učesal - fb8ab40 - a sepsal si poznámky:

const ActorType = {
  BF: "BF",
  FULL: "FULL",
  TEST: "TEST"
};

Bordel v input typech. Nově používáme tyhle tři, ale některé aktory mají svoje extra typy.

// tsbohemia-daily
export const LABELS = {
  START: "START",
  BF: "BF",
  PAGE: "PAGE",
  PRICE: "PRICE"
};

// alza-daily
const TYPE = {
  FULL: "FULL",
  TRHAK: "TRHAK",
  FEED: "FEED",
  BLACK_FRIDAY: "BF",
  TEST: "TEST"
};

// conrad-daily
export const LABELS = {
  API_START: "API-START",
  API_LIST: "API-LIST",
  API_DETAIL: "API-DETAIL",

  SITEMAP_START: "SITEMAP-START",
  SITEMAP_LIST: "SITEMAP-LIST"
};

// datart-daily
const LABELS = {
  START: "START",
  CATEGORY: "CATEGORY",
  CATEGORY_NEXT: "CATEGORY_NEXT",
  BF: "BF"
};
type === "COUNT" // ??

// dek-daily
// proč je main.js v src? Proč vůbec existuje src dir ve všech aktorech?

// e-coop-daily
// nemá žádný input.type

// electroworld-daily
type === "DETAIL"
type === "COUNT"
type === "TEST_FULL"
type === "FULL" || type === "TEST_FULL"


// eva-daily
type === "FULL" || type === "COUNT"
type === "COUNT" ? "COUNT" : "CATEGORY",
!development && type !== "COUNT"

// hornbach-daily
// zase main v src a žádný typ
// jakej je vztah mezi LABEL a TYPE?
export const LABELS = {
  SITE: "SITE",
  CATEGORY: "CATEGORY"
};

// hs-reviews
// žádný typ a extra main.test.mjs file, tohle bude první pokud o testování a měl by bejt nahrazenej ActorType.TEST?

// iglobus-daily
// žádný typ

// ikea-daily
// main v src
type = "DAILY"
type === "DAILY"
type === "COUNT"

// itesco-daily
// 👌

// kasa-count
// žádné typy, ale používájí se LABELS - LIST a DETAIL

// kasa-daily
request.userData.label === "START"
request.userData.label === "LAST_CATEGORY_PAGE"
label: "LAST_CATEGORY"
request.userData.label === "SUB_CATEGORY"
request.userData.label === "MAIN_CATEGORY"
request.userData.label === LAST_CATEGORY
// takže jakej je rozdíl mezi type a label?

// knihydobrovsky-count
// žádný type ale label
switch (label) {
  case "LIST":
  case "SUBLIST":

// knihydobrovsky-daily
// typy plus labels
label: "LIST"
label: "SUBLIST"

// kosik-daily
// pouze BF type, přidal jsem FULL jako default

// lekarna-daily
// FULL a BF typy plus labely
request.userData.label === "SUB_CATEGORY"
request.userData.label === "PAGE"
request.userData.label === "PAGI_PAGE"
request.userData.label === "START"

// lidl-daily
// zase main v src, tohle dělá Lukáš pořád
// použit pouze BF typ a mraky labelů
switch (label) 
  case LABELS.DETAIL
  case LABELS.LIDL_SHOP
  case LABELS.LIDL_SHOP_CAT
  case LABELS.LIDL_SHOP_DETAIL
  case LABELS.LIDL_SHOP_MAIN_CAT
  case LABELS.LIDL_SHOP_SECTION
  case LABELS.MAIN_NABIDKA
  case LABELS.MAIN_NABIDKA_CAT

// luxor-daily
// tady se label == type a bůbec ten actor vypadá jinak než ostatní, proč?
type = LABELS.API_START, // API_START | FRONT_START | SITEMAP_START

const LABELS = {
  API_START: "API-START",
  API_LIST: "API-LIST",
  API_DETAIL: "API-DETAIL",

  FRONT_START: "FRONT-START",
  FRONT_LIST: "FRONT-LIST",
  FRONT_DETAIL: "FRONT-DETAIL",

  SITEMAP_START: "SITEMAP-START",
  SITEMAP_LIST: "SITEMAP-LIST"
};
switch (priceList[priceIx].type) {
  case "RECOMMENDED":
  case "SALE":

// makro-daily
// žádné typy, pouze labels
label: "START"
case "LIST":
case "PAGE":

// mall-daily
// klasické typy a jeden extra navíc plus labely
type === "CZECHITAS"
label: "PAGE"
label: "START"
label: "CZECHITAS-START"
label: "MAP"
label: "REVIEW",

// megaknihy-daily
// zase main v src a žádný type
switch (label)
case "START":
case "PAGE":

// mironet-daily
// základní typy a cizí labely
label: "page"
label: "category"
label: "page"
label: "category_vyprodej"
label: "pages"

// mountfield-daily
// main v src, LABELS consts :(, ale typy jsou (bf, full a test)
export const LABELS = {
  MAIN_NABIDKA: "MAIN_NABIDKA",
  MAIN_NABIDKA_CAT: "MAIN_NABIDKA_CAT",
  DETAIL: "DETAIL",
  LIDL_SHOP: "LIDL_SHOP",
  LIDL_SHOP_MAIN_CAT: "LIDL_SHOP_MAIN_CAT",
  LIDL_SHOP_CAT: "LIDL_SHOP_CAT",
  LIDL_SHOP_DETAIL: "LIDL_SHOP_DETAIL",
  LIDL_SHOP_SECTION: "LIDL_SHOP_SECTION"
};


// mp-daily
// Žádné type, ale LABELS konstanta se tahá z contextu, wtf?
 const crawlContext = await init();
 const { input, requestQueue, log, LABELS } = crawlContext;

// notino-daily
type !== "CZECHITAS"
label: BF
{ label: HOME_PAGE }
{ label: CATEGORY_PAGE }

// obi-daily
// no type just labels
label: "LIST"
label: "DETAIL"
label: "START"
label: label + "I"  // WTF?
label.includes("SUBCAT") // fuck

// okay-daily
// Using ActorType now
const LABEL = {
  COLLECTION: "COLLECTION",
  COLLECTIONS: "COLLECTIONS",
  LIST: "LIST"
};

// pilulka-daily
// zahrabanej main v src
// Používa je BF, FULL jako default

// prozdravi-daily
// main v src
export const LABELS = {
  START: "START",
  PRODUCTS: "PRODUCTS",
  // BF: "BF" removed
};

// rohlik-daily
// type nepoužit
label: "main"
label: "list"
label: "PAGE"

// rozetka-daily
// routes? To je asi SPA
// ActorType nema DAILY ani COUNT, nechávám zatím být
export const ACTOR_TYPES = {
  DAILY: "DAILY",
  COUNT: "COUNT"
};
export const LABELS = {
  MAIN_PAGE: "MAIN_PAGE",
  CATEGORY_OR_PRODUCTS: "CATEGORY_OR_PRODUCTS"
};

// sleky-daily
// tady se místo type použivá mode (?)
mode === "LIST"
mode === "DETAIL"

// tetadrogerie-daily
// konečně actor bez zbytečných src/*

// tchibo-daily
// nepoužíva type, jen labels
const LABELS = {
  NAVIGATION: "NAVIGATION",
  CATEGORY: "CATEGORY",
  CATEGORY_CAT: "CATEGORY_CAT",
  COFFEE_CATEGORY: "COFFEE_CATEGORY",
  LIST: "LIST"
};

// tsbohemia-daily
// border v tom že label se chová jako type 
export const LABELS = {
  START: "START",
  BF: "BF",
  PAGE: "PAGE",
  PRICE: "PRICE"
};

- } else if (type === "test") {
+ } else if (type === ActorType.TEST) {

type === LABELS.PRICE

@rarous
Copy link
Collaborator Author

rarous commented Mar 23, 2022

Pozor, LABEL je něco jinýho než TYPE. TYPE určuje v jakém módu jede celý actor. LABEL je konkrétní krok scraperu

@junkycoder
Copy link
Contributor

Ano, ale použitý je to často jako jedno a to samé. Musíme to roztrhnout, aby to labels nechodily hodnoty z type a obráceně..

@rarous
Copy link
Collaborator Author

rarous commented Mar 23, 2022 via email

junkycoder added a commit that referenced this issue Mar 28, 2022
`yarn test` actually calls 10 PAGEs rn. Does not test any other of special labels like BF or TRHAK. Still looks like good enough for now. Follow issue #819.
junkycoder added a commit that referenced this issue Mar 30, 2022
Trying to implement #819 but I am unable to reduce request calls. This context hell needs to be simplified.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
actor enhancement New feature or request javascript Pull requests that update Javascript code
Projects
None yet
Development

No branches or pull requests

2 participants