рдПрдХ рдФрд░ рдирдХрд▓реА рдкреБрд╕реНрддрдХрд╛рд▓рдп

рд╢реБрдн рджреЛрдкрд╣рд░ рдореИрдВ рдЯреЗрд╕реНрдЯ рдСрдЯреЛрдореЗрд╢рди рдореЗрдВ рд▓рдЧрд╛ рд╣реВрдВред рд╕рднреА рд╕реНрд╡рдЪрд╛рд▓рди рдЗрдВрдЬреАрдирд┐рдпрд░реЛрдВ рдХреА рддрд░рд╣, рдореЗрд░реЗ рдкрд╛рд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдФрд░ рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реИ рдЬреЛ рдореИрдВ рдЖрдорддреМрд░ рдкрд░ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЪреБрдирддрд╛ рд╣реВрдВред рд▓реЗрдХрд┐рди рд╕рдордп-рд╕рдордп рдкрд░ рдРрд╕реЗ рд╣рд╛рд▓рд╛рдд рд╣реЛрддреЗ рд╣реИрдВ рдЬрдм рдХреЛрдИ рднреА рдкрд░рд┐рдЪрд┐рдд рдкреБрд╕реНрддрдХрд╛рд▓рдп рдСрдЯреЛрдЯреЗрд╕реНрдЯ рдХреЛ рдЕрд╕реНрдерд┐рд░ рдпрд╛ рдирд╛рдЬреБрдХ рдмрдирд╛рдиреЗ рдХреЗ рдЬреЛрдЦрд┐рдо рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рдЖрдкрдХреЛ рдпрд╣ рдмрддрд╛рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ mock'ov рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдкреНрд░рддреАрдд рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдорд╛рдирдХ рдХрд╛рд░реНрдп рдиреЗ рдореБрдЭреЗ рдЕрдкрдиреЗ рдореЙрдбреНрдпреВрд▓ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХреИрд╕реЗ рдкреНрд░реЗрд░рд┐рдд рдХрд┐рдпрд╛ред рдореИрдВ рдЕрдкрдиреЗ рдлреИрд╕рд▓реЗ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реБрдирдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред


рдЖрд╡реЗрджрди


рд╡рд┐рддреНрддреАрдп рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд▓реЗрдЦрд╛ рдкрд░реАрдХреНрд╖рд╛ рд╣реИред рдбреЗрдЯрд╛ рдХреЛ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рдЬрд╛рдВрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рд╕реБрд▓рд╣)ред рдЗрд╕ рд╕рдВрдмрдВрдз рдореЗрдВ, рдЬрд┐рд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдореИрдВрдиреЗ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рд╡рд╣ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ред рдХреБрдЫ рд╕рд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рд╣рдорд╛рд░реА рдЯреАрдо рддрддреНрдХрд╛рд▓ рджреВрддреЛрдВ рд╕реЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣реА рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП, рдПрдХ рдЙрдЪрд┐рдд рдШрдЯрдирд╛ рдЗрд▓рд╛рд╕реНрдЯрд┐рдХреНрд╕ рдЦреЛрдЬ рдореЗрдВ рдмрдирд╛рдИ рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред рд╕рддреНрдпрд╛рдкрди рдЖрд╡реЗрджрди рд╣рдорд╛рд░реА рдирд┐рдЧрд░рд╛рдиреА рдореЗрдВ рд╣реЛрдЧрд╛ рдХрд┐ рдЖрд╡реЗрджрди рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рдХрд┐рдП рдЧрдП рд╣реИрдВред


рддреЛ, рдХрд▓реНрдкрдирд╛ рдХреАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдкреНрд░рдгрд╛рд▓реА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдШрдЯрдХ рд╣реИрдВ:


  1. рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕рд░реНрд╡рд░ред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдПрдХ рдПрдХрд▓ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдмрд┐рдВрджреБ рд╣реИ рдЬрд╣рд╛рдВ рд╡рд╣ рди рдХреЗрд╡рд▓ рд╕рддреНрдпрд╛рдкрди рдХреЗ рд▓рд┐рдП рдЖрд╡реЗрджрди рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдЕрдиреНрдп рдШрдЯрдХ рднреАред
  2. рд╕рддреНрдпрд╛рдкрди рдХрд╛ рдЖрд╡реЗрджрдиред
  3. рдЖрд╡реЗрджрди рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рд╕реЗ рдбреЗрдЯрд╛ рдЬреЛ рдЗрд▓рд╛рд╕реНрдЯрд┐рдХреНрд╕ рдЦреЛрдЬ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реЛрддреЗ рд╣реИрдВред
  4. рд╕рдВрджрд░реНрдн рдбреЗрдЯрд╛ред рдбреЗрдЯрд╛ рдкреНрд░рд╛рд░реВрдк рдореИрд╕реЗрдВрдЬрд░ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдПрдХреАрдХреГрдд рд╣реИред

рдХрд╛рд░реНрдп


рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рд╕реНрд╡рдЪрд╛рд▓рди рдХрд╛рдлреА рд╕реАрдзрд╛ рд▓рдЧрддрд╛ рд╣реИ:


  1. рдкрд░реНрдпрд╛рд╡рд░рдг рддреИрдпрд╛рд░реА:
    • рдПрд▓рд┐рд╕реНрдЯрд┐рдХреНрд╕ рдЦреЛрдЬ рдиреНрдпреВрдирддрдо рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди (рдПрдордПрд╕рдЖрдИ рдФрд░ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ) рдХреЗ рд╕рд╛рде рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
    • рдПрдХ рд╕рддреНрдпрд╛рдкрди рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
  2. рдкрд░реАрдХреНрд╖рдг рдирд┐рд╖реНрдкрд╛рджрди:
    • рдПрдХ рд╕рддреНрдпрд╛рдкрди рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
    • рдПрд▓рд┐рд╕реНрдЯрд┐рдХреНрд╕ рдЦреЛрдЬ рд╕рдВрдмрдВрдзрд┐рдд рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рд╕реЗ рднрд░рд╛ рд╣реИ (рдХрд┐рддрдиреЗ рдЖрд╡реЗрджрди рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдП рдЧрдП рдереЗ)ред
    • рд╕рдВрджреЗрд╢ рдореИрд╕реЗрдВрдЬрд░ рд╕реЗ "рд╕рдВрджрд░реНрдн" рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд┐рддрдиреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рдерд╛)ред
    • рдЖрд╡реЗрджрди рджреНрд╡рд╛рд░рд╛ рдЬрд╛рд░реА рдХрд┐рдП рдЧрдП рдлреИрд╕рд▓реЗ рдХреА рдЬрд╛рдБрдЪ рдХреА рдЬрд╛рддреА рд╣реИ: рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд┐рдП рдЧрдП рдЖрд╡реЗрджрдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛, рд▓рд╛рдкрддрд╛ рдЖрд╡реЗрджрдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЖрджрд┐ред
  3. рдкрд░реНрдпрд╛рд╡рд░рдг рдХреА рд╕рдлрд╛рдИред

рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдирд┐рдЧрд░рд╛рдиреА рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕рд░реНрд╡рд░ рд╕реЗ рдбреЗрдЯрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдкреНрд░рддреНрдпреЗрдХ рд░рди рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡рд░ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ рдПрдХ рд╕рдордп рд▓реЗрдиреЗ рд╡рд╛рд▓реА рдХрд╛рд░реНрд░рд╡рд╛рдИ рд╣реИ (рдЗрд╕рдХрд╛ рдЕрдкрдирд╛ рдЖрдзрд╛рд░ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП)ред рджреВрд╕рд░реА рдмрд╛рдд, рдореИрдВ рджреЛрд╖ рдЦреЛрдЬрдиреЗ рдкрд░ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рд╕реНрдерд╛рдиреАрдпрдХрд░рдг рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдЕрдВрдд рдореЗрдВ, рдирдХрд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ред


рдпрд╣рд╛рдВ рдпрд╣ рд╕рд╡рд╛рд▓ рдЙрда рд╕рдХрддрд╛ рд╣реИ: "рдпрджрд┐ рд╣рдо рдЕрднреА рднреА рд╕рд░реНрд╡рд░ рдХрд╛ рдордЬрд╛рдХ рдЙрдбрд╝рд╛рддреЗ рд╣реИрдВ, рддреЛ рд╢рд╛рдпрдж рд╣рдо рдЗрд▓рд╛рд╕реНрдЯрд┐рдХреНрд╕ рдЦреЛрдЬ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдФрд░ рднрд░рдиреЗ рдореЗрдВ рд╕рдордп рдирд╣реАрдВ рд▓рдЧрд╛ рд╕рдХрддреЗ, рд▓реЗрдХрд┐рди рдирдХрд▓реА рдХреА рдЬрдЧрд╣ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ?"ред рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА, рдЖрдкрдХреЛ рд╣рдореЗрд╢рд╛ рдпрд╛рдж рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдореЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рд▓рдЪреАрд▓рд╛рдкрди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореЙрдХ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХрддрд╛ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рджрд╛рдпрд┐рддреНрд╡ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ рдЗрд▓рд╛рд╕реНрдЯрд┐рдХреНрд╕ рдЦреЛрдЬ рдХреЛ рдмрджрд▓рдиреЗ рд╕реЗ рдЗрдирдХрд╛рд░ рдХрд░ рджрд┐рдпрд╛: рдЗрд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдФрд░ рднрд░рдирд╛ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИред


рдкрд╣рд▓рд╛ рдореЙрдХ


рд╕рд░реНрд╡рд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ GET рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдХрдИ рддрд░реАрдХреЛрдВ рд╕реЗ / рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рднреЗрдЬрддрд╛ рд╣реИред рд╣рдо рджреЛ рддрд░рд╣ рд╕реЗ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВред рдкрд╣рд▓рд╛ рдХреНрд▓рд╕реНрдЯрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд╕рд╛рде /configuration/data_cluster рд╣реИ


 { "host": "127.0.0.1", "port": 443, "credentials": { "username": "user", "password": "pass" } } 

рджреВрд╕рд░рд╛ рд╣реИ рдбреНрд░рд┐рд▓рд┐рдВрдЧ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд╕рд╛рде /configuration/reconciliation


 { "reconciliation_interval": 3600, "configuration_update_interval": 60, "source": { "address": "file:///c:/path", "credentials": { "username": "user", "password": "pass" } } } 

рдХрдард┐рдирд╛рдИ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдкрд░реАрдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди рдпрд╛ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдмреАрдЪ рд╕рд░реНрд╡рд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ, рдЧрд▓рдд рдкрд╛рд╕рд╡рд░реНрдб рдЖрджрд┐ рдХрд╛ рдЬрд╡рд╛рдм рджреЗ рд╕рдХреЗред


рддреЛ, рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдирдХрд▓реА рдХреЗ рд▓рд┐рдП рд╕реНрдереИрддрд┐рдХ рдирдХрд▓реА рдФрд░ рдЙрдкрдХрд░рдг (рдореЙрдХ, рдкрд╛рдЗрд╕реНрдЯреЗрд╕реНрдЯ рд╕реЗ рдмрдВрджрд░рдкреИрдХ, рдЖрджрд┐) рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рдореБрдЭреЗ рдПрдХ рдмрдбрд╝рд╛ pretenders рдкреБрд╕реНрддрдХрд╛рд▓рдп рдорд┐рд▓рд╛ рдЬреЛ рдореБрдЭреЗ рд▓рдЧрд╛ рдХрд┐ рдореЗрд░реЗ рд▓рд┐рдП рд╕рд╣реА рд╣реИред Pretenders рдирд┐рдпрдореЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ HTTP рд╕рд░реНрд╡рд░ рдмрдирд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╕рд░реНрд╡рд░ рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рдЬрд╡рд╛рдм рдХреИрд╕реЗ рджреЗрдЧрд╛ред рдирд┐рдпрдореЛрдВ рдХреЛ рдкреНрд░реАрд╕реЗрдЯ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкрд░реАрдХреНрд╖рдг рд╕реВрдЯ рдХреЗ рд▓рд┐рдП рдореЛрдЬрд╝реЗрдХ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдкреНрд░реАрд╕реЗрдЯреНрд╕ рдХреЛ рд╕рд╛рдлрд╝ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рд╕реЗ рднрд░рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЖрдк рдЖрд╡рд╢реНрдпрдХрддрд╛рдиреБрд╕рд╛рд░ рдЙрддреНрддрд░ рдЕрдкрдбреЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдкрд░реНрдпрд╛рд╡рд░рдг рдХреА рддреИрдпрд╛рд░реА рдХреЗ рджреМрд░рд╛рди рд╕рд░реНрд╡рд░ рдХреЛ рдПрдХ рдмрд╛рд░ рд╕реНрд╡рдпрдВ рд╣реА рдЙрдард╛рдирд╛ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ:


 python -m pretenders.server.server --host 127.0.0.1 --port 8000 

рдФрд░ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рд╣рдореЗрдВ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╕рд░рд▓рддрдо рдорд╛рдорд▓реЗ рдореЗрдВ, рдЬрдм рдЙрддреНрддрд░ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╣рд╛рд░реНрдбрдХреЛрдбреЗрдб рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ:


 import json import pytest from pretenders.client.http import HTTPMock from pretenders.common.constants import FOREVER @pytest.fixture def configuration_server_mock(request): mock = HTTPMock(host="127.0.0.1", port=8000, name="server") request.addfinalizer(mock.reset) return mock def test_something(configuration_server_mock): configuration_server_mock.when("GET /configuration/data_cluster").reply( headers={"Content-Type": "application/json"}, body=json.dumps({ "host": "127.0.0.1", "port": 443, "credentials": { "username": "user", "password": "pass", }, }), status=200, times=FOREVER, ) configuration_server_mock.when("GET /configuration/reconciliation").reply( headers={"Content-Type": "application/json"}, body=json.dumps({ "reconciliation_interval": 3600, "configuration_update_interval": 60, "source": { "address": "file:///c:/path", "credentials": { "username": "user", "password": "pass", }, }, }), status=200, times=FOREVER, ) # test application 

рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдм рдирд╣реАрдВ рд╣реИред рдЕрдкрдиреЗ рд▓рдЪреАрд▓реЗрдкрди рдХреЗ рд╕рд╛рде, pretenders рдХреА рджреЛ рд╕реАрдорд╛рдПрдБ рд╣реЛрддреА рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдпрд╛рдж рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рдВрдмреЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:


  1. рдирд┐рдпрдореЛрдВ рдХреЛ рдПрдХ рдмрд╛рд░ рдореЗрдВ рд╣рдЯрд╛рдпрд╛ рдирд╣реАрдВ рдЬрд╛ рд╕рдХрддрд╛ред рдЙрддреНрддрд░ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкреВрд░реЗ рдкреВрд░реНрд╡ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреЛ рд╣рдЯрд╛рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рд╕рднреА рдирд┐рдпрдореЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ред
  2. рдирд┐рдпрдореЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдкрде рд╕рд╛рдкреЗрдХреНрд╖ рд╣реИрдВред рдкреНрд░реАрд╕реЗрдЯ рдореЗрдВ рдлрд╝реЙрд░реНрдо / mockhttp / <preset_name> рдХрд╛ рдПрдХ рдЕрдиреВрдард╛ рдкрде рд╣реИ, рдФрд░ рдпрд╣ рдкрде рдирд┐рдпрдореЛрдВ рдореЗрдВ рд╕рднреА рдмрдирд╛рдП рдЧрдП рдкрдереЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрд╕рд░реНрдЧ рд╣реИред рдкрд░реАрдХреНрд╖рдг рдХреЗ рддрд╣рдд рдЖрд╡реЗрджрди рдХреЗрд╡рд▓ рдореЗрдЬрдмрд╛рди рдирд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдЙрдкрд╕рд░реНрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рди рд╕рдХрддрд╛ рд╣реИред

рдкрд╣рд▓реА рд╕реАрдорд╛ рдмрд╣реБрдд рдЕрдкреНрд░рд┐рдп рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдореЙрдбреНрдпреВрд▓ рд▓рд┐рдЦрдХрд░ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХреЛ рдЕрдВрдЬрд╛рдо рджреЗрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕рд▓рд┐рдП


 configuration.data_cluster.port = 443 

рдпрд╛ (рдЕрджреНрдпрддрди рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдХрдо рдмрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП)


 data_cluster_config = get_default_data_cluster_config() data_cluster_config.port = 443 configuration.update_data_cluster(data_cluster_config) 

рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдирдХреИрдкреНрд╕реБрд▓реЗрд╢рди рд╕реЗ рд╣рдо рд╕рднреА рд░рд╛рд╕реНрддреЛрдВ рдХреЛ рд▓рдЧрднрдЧ рджрд░реНрдж рд░рд╣рд┐рдд рддрд░реАрдХреЗ рд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдк рдкреНрд░рддреНрдпреЗрдХ рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдФрд░ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп (рдореБрдЦреНрдп) рдкреВрд░реНрд╡ рдирд┐рд░реНрдзрд╛рд░рд┐рдд, рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рди (307 рдпрд╛ 308 рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ) рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░реАрд╕реЗрдЯ рднреА рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдлрд┐рд░ рдЖрдк рдирд┐рдпрдо рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рдкреВрд░реНрд╡ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреЛ рд╕рд╛рдл рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рдЙрдкрд╕рд░реНрдЧреЛрдВ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдорд┐рддрдкреНрд░реЛрдХреНрд╕реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдПрдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдЙрдкрдХрд░рдг рд╣реИ рдЬреЛ рдЕрдиреНрдп рдЪреАрдЬреЛрдВ рдХреЗ рд╕рд╛рде, рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╣рдо рдЙрдкрд╕рд░реНрдЧреЛрдВ рдХреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдирд┐рдХрд╛рд▓реЗрдВрдЧреЗ:


 mitmdump --mode reverse:http://127.0.0.1:8000 --replacements :~http:^/:/mockhttp/server/ --listen-host 127.0.01 --listen-port 80 

рдЗрд╕ рдХрдорд╛рдВрдб рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реИрдВ:


  1. --listen-host 127.0.0.1 рдФрд░ --listen-port 80 рд╕реНрдкрд╖реНрдЯ рд╣реИрдВред рдорд┐рддреНрдкреНрд░реЙрдХреНрд╕реА рдЕрдкрдиреЗ рд╕рд░реНрд╡рд░ рдХреЛ рдмрдврд╝рд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рд╣рдо рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдФрд░ рдкреЛрд░реНрдЯ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдпрд╣ рд╕рд░реНрд╡рд░ рд╕реБрдирддрд╛ рд╣реИред
  2. --mode reverse:http://127.0.0.1:8000 рдЕрд░реНрде рд╣реИ рдХрд┐ рдорд┐рдЯрдкреНрд░реЛрдХреНрд╕реА рд╕рд░реНрд╡рд░ рдХреЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ http://127.0.0.1:8000 рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдФрд░ рдкрдврд╝реЗрдВ рдпрд╣рд╛рдБ
  3. --replacements :~http:^/:/mockhttp/server/ рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдмрджрд▓рд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рдореЗрдВ рддреАрди рднрд╛рдЧ рд╣реЛрддреЗ рд╣реИрдВ: рдПрдХ рдЕрдиреБрд░реЛрдз рдлрд╝рд┐рд▓реНрдЯрд░ ( ~http HTTP рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП ~http ), (рдкрде рдХреА рд╢реБрд░реБрдЖрдд рдХреА рдЬрдЧрд╣ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ), рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд ( /mockhttp/server )ред рдФрд░ рдкрдврд╝реЗрдВ рдпрд╣рд╛рдБ

рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рд╕рднреА HTTP рдЕрдиреБрд░реЛрдзреЛрдВ рдореЗрдВ mockhttp/server рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ http://127.0.0.1:8000 , рдЕрд░реНрдерд╛рддреН рдкрд░ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рд╕рд░реНрд╡рд░ рдХреЗ рдмрд╣рд╛рдиреЗред рдирддреАрдЬрддрди, рд╣рдордиреЗ рдпрд╣ рд╣рд╛рд╕рд┐рд▓ рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ рдХрд┐ рдЕрдм рд╡рд┐рдиреНрдпрд╛рд╕ рдХреЛ GET рдХреЗ рдЕрдиреБрд░реЛрдз рдХреЗ рд╕рд╛рде http://127.0.0.1/configuration/data_cluster рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдореИрдВ mitmproxy рдФрд░ mitmproxy рд╕рд╛рде рдбрд┐рдЬрд╛рдЗрди рд╕реЗ рд╕рдВрддреБрд╖реНрдЯ рдерд╛ред рд╕реНрдкрд╖реНрдЯ рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рд╕рд╛рде - рдЖрдЦрд┐рд░рдХрд╛рд░, рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдПрдХ рдХреЗ рдмрдЬрд╛рдп 2 рд╕рд░реНрд╡рд░ - рддреИрдпрд╛рд░реА рдореЗрдВ 2 рдкреИрдХреЗрдЬ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдкрд░ 2 рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИред рдПрдХ рдореЙрдХ рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдм рдХреБрдЫ рдЗрддрдирд╛ рд╕рд░рд▓ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рднреА рдЬрдЯрд┐рд▓рддрд╛ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рд╕реНрдерд╛рди (рдкреНрд░реАрд╕реЗрдЯ) рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рддреА рд╣реИ рдФрд░ рдЗрд╕реЗ рдХрд╛рдлреА рд╕рд░рд▓рддрд╛ рд╕реЗ рдФрд░ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рддрд░реАрдХреЗ рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдирдИ рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рд╕рд╛рдордиреЗ рдЖрдИ рдЬрд┐рд╕рдиреЗ рдореБрдЭреЗ рдПрдХ рдирдП рд╕рдорд╛рдзрд╛рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрд╛ред


рджреВрд╕рд░рд╛ рдирдХрд▓реА


рдЙрд╕ рдХреНрд╖рдг рддрдХ, рдореИрдВрдиреЗ рд▓рдЧрднрдЧ рдпрд╣ рдирд╣реАрдВ рдХрд╣рд╛ рдХрд┐ рд╕рдВрджрд░реНрдн рдбреЗрдЯрд╛ рдХрд╣рд╛рдВ рд╕реЗ рдЖрдпрд╛ рд╣реИред рдПрдХ рдЪреМрдХрд╕ рдкрд╛рдардХ рдпрд╣ рдиреЛрдЯрд┐рд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдКрдкрд░ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рдкрде рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рдХреЗ рдкрддреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдПрдХ рд╡рд┐рдХреНрд░реЗрддрд╛ рдХреЗ рд▓рд┐рдПред рдПрдХ рдЕрдиреНрдп рд╡рд┐рдХреНрд░реЗрддрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдкреАрдЖрдИ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдЙрд╕рдХреЗ рд╕рд╛рде рдерд╛ рдХрд┐ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдЙрддреНрдкрдиреНрди рд╣реБрдИред рдкрд░реАрдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди рд╡реЗрдВрдбрд░ рдПрдкреАрдЖрдИ рдХреЛ рдЙрдард╛рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕реЗ рдкрд╣рд▓реЗ рдХреА рдпреЛрдЬрдирд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдирдХрд▓реА рдХреЗ рд╕рд╛рде рдмрджрд▓рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рдИред рд▓реЗрдХрд┐рди рдЖрд╡реЗрджрди рдкрддреНрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлреЙрд░реНрдо рдХрд╛ рдПрдХ рдЕрдиреБрд░реЛрдз


 GET /application-history?page=2&size=5&start=1569148012&end=1569148446 

рдпрд╣рд╛рдВ 2 рдмрд┐рдВрджреБ рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдХреБрдЫ рд╡рд┐рдХрд▓реНрдкред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдХрд┐рд╕реА рднреА рдХреНрд░рдо рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ pretenders рд╢рд╛рд╕рди рдХреЗ рд▓рд┐рдП рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдпрд╛рдж рд░рдЦрдирд╛ рднреА рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдкреИрд░рд╛рдореАрдЯрд░ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдХреНрд░рдо рдЬреИрд╕реА рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред рджреВрд╕рд░реЗ, рдЕрдВрддрд┐рдо рдкреИрд░рд╛рдореАрдЯрд░ (рд╢реБрд░реВ рдФрд░ рдЕрдВрдд) рдЖрджреЗрд╢ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордп рдЕрдВрддрд░рд╛рд▓ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВред рдФрд░ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдЕрдЧреНрд░рд┐рдо рдореЗрдВ рдЕрдиреБрдорд╛рди рдирд╣реАрдВ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреМрди рд╕рд╛ рдЕрдВрддрд░рд╛рд▓ (рдкрд░рд┐рдорд╛рдг рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдкреНрд░рд╛рд░рдВрдн рд╕рдордп) рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрд╡реЗрджрди рджреНрд╡рд╛рд░рд╛ рдирдХрд▓реА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╕реАрдзреЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рд╣рдореЗрдВ "рдЙрдЪрд┐рдд" рдЙрддреНрддрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреИрд░рд╛рдореАрдЯрд░ рдорд╛рдиреЛрдВ рдХреЛ рдЬрд╛рдирдирд╛ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ "рдЙрдЪрд┐рддрддрд╛" рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рддрд╛рдХрд┐ рд╣рдо рдпрд╣ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХреЗрдВ рдХрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкреЗрдЬрд┐рдВрдЧ рдХреЗ рд╕рднреА рдкрдиреНрдиреЛрдВ рд╕реЗ рдЧреБрдЬрд░рддрд╛ рд╣реИ: рдпрджрд┐ рд╣рдо рд╕рднреА рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдЙрддреНрддрд░ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рджреЛрд╖реЛрдВ рдХреЛ рдЦреЛрдЬрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ, рдХреЗрд╡рд▓ рдкрд╛рдВрдЪ рдореЗрдВ рд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рдкреГрд╖реНрда рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред ред


рдореИрдВрдиреЗ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕рдорд╛рдзрд╛рди рдЦреЛрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди рдЕрдВрдд рдореЗрдВ рдореИрдВрдиреЗ рдЦреБрдж рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рддреЛ рдПрдХ рдвреАрд▓рд╛ рд╕рд░реНрд╡рд░ рдерд╛ ред рдпрд╣ рдПрдХ рдлреНрд▓рд╛рд╕реНрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдкрде рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рд╢реБрд░реВ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░, рд╡рд╣ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдЕрдиреБрд░реЛрдз рдХреЗ рдкреНрд░рдХрд╛рд░ (GET, POST, рдЖрджрд┐) рдФрд░ рдкрде рдХреЗ рд▓рд┐рдП рдирд┐рдпрдореЛрдВ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛рдПред рдпрд╣ рдЖрдкрдХреЛ рдореВрд▓ рдХрд╛рд░реНрдп рдореЗрдВ pretenders рдФрд░ mitmproxy рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдореИрдВ рдпрд╣ рднреА рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд┐рдХреНрд░реЗрддрд╛ рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рдирдХрд▓реА рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рдПрдХ рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП 2 рдореБрдЦреНрдп рд░рд╛рд╕реНрддреЗ рдЪрд╛рд╣рд┐рдП:


  1. рдЖрдзрд╛рд░ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБред рдпрд╣ рд╡рд╣реА рдЙрдкрд╕рд░реНрдЧ рд╣реИ рдЬреЛ рд╕рднреА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдирд┐рдпрдореЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
  2. рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕рдорд╛рдкрди рдмрд┐рдВрджреБред рдпрд╣ рдЙрди рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рдЙрдкрд╕рд░реНрдЧ рд╣реИ, рдЬрд┐рдирдХреЗ рд╕рд╛рде рдЖрдк рд╕реНрд╡рдпрдВ рдореЙрдХ рд╕рд░реНрд╡рд░ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

 python -m looseserver.default.server.run --host 127.0.0.1 --port 80 --base-endpoint / --configuration-endpoint /_mock_configuration/ 

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдмреЗрд╕ рдПрдВрдбрдкреЙрдЗрдВрдЯ рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдПрдВрдбрдкреЙрдЗрдВрдЯ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдирд╣реАрдВ рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИ рддрд╛рдХрд┐ рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рдорд╛рддрд╛-рдкрд┐рддрд╛ рд╣реЛред рдЕрдиреНрдпрдерд╛, рдПрдХ рдЬреЛрдЦрд┐рдо рд╣реИ рдХрд┐ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдкрде рд╕рдВрдШрд░реНрд╖ рд╣реЛрдЧрд╛ред рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдкреВрд░реНрд╡рд╡рд░реНрддреАрддрд╛ рд▓реЗ рдЬрд╛рдПрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдлреНрд▓рд╛рд╕реНрдХ рдирд┐рдпрдо рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдбрд╛рдпрдирд╛рдорд┐рдХ рдкрдереЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдкрд╣рд▓реЗ рдЬреЛрдбрд╝реЗ рдЧрдП рд╣реИрдВред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ --base-endpoint /configuration/ рдпрджрд┐ рд╣рдо рдЗрд╕ рдореЙрдХ рдореЗрдВ рд╡рд┐рдХреНрд░реЗрддрд╛ рдПрдкреАрдЖрдИ рдХреЛ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рдереЗред


рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХрд╛ рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╕рдВрд╕реНрдХрд░рдг рдмрд╣реБрдд рдХреБрдЫ рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИ


 import json import pytest from looseserver.default.client.http import HTTPClient from looseserver.default.client.rule import PathRule from looseserver.default.client.response import FixedResponse @pytest.fixture def configuration_server_mock(request): class MockFactory: def __init__(self): self._client = HTTPClient(configuration_url="http://127.0.0.1/_mock_configuration/") self._rule_ids = [] def create_rule(self, path, json_response): rule = self._client.create_rule(PathRule(path=path)) self._rule_ids.append(rule.rule_id) response = FixedResponse( headers={"Content-Type": "application/json"}, status=200, body=json.dumps(json_response), ) self._client.set_response(rule_id=rule.rule_id, response=response) def _delete_rules(self): for rule_id in self._rule_ids: self._client.remove_rule(rule_id=rule_id) mock = MockFactory() request.addfinalizer(mock._delete_rules) return mock def test_something(configuration_server_mock): configuration_server_mock.create_rule( path="configuration/data_cluster", json_response={ "host": "127.0.0.1", "port": 443, "credentials": { "username": "user", "password": "pass", }, } ) configuration_server_mock.create_rule( path="configuration/reconciliation", json_response={ "reconciliation_interval": 3600, "configuration_update_interval": 60, "source": { "address": "file:///applications", "credentials": { "username": "user", "password": "pass", }, }, } ) 

рд╕реНрдерд┐рд░рддрд╛ рдЕрдзрд┐рдХ рдХрдард┐рди рд╣реЛ рдЧрдИ рд╣реИ, рд▓реЗрдХрд┐рди рдирд┐рдпрдореЛрдВ рдХреЛ рдЕрдм рдПрдХ рдмрд╛рд░ рдореЗрдВ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдЙрдирдХреЗ рд╕рд╛рде рдХрд╛рдо рдХреЛ рд╕рд░рд▓ рдХрд░рддрд╛ рд╣реИред mitmproxy рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдм рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред


рдЪрд▓реЛ рд╡рд┐рдХреНрд░реЗрддрд╛ рдПрдкреАрдЖрдИ рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рддреЗ рд╣реИрдВред рд╣рдо рдвреАрд▓реЗ рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдП рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд┐рдпрдо рдмрдирд╛рдПрдВрдЧреЗ, рдЬреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдорд╛рди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЙрддреНрддрд░ рджреЗрдЧрд╛ред рдЖрдЧреЗ рд╣рдо рдкреЗрдЬ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдирд┐рдпрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред


рд╕рд░реНрд╡рд░ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдирдП рдирд┐рдпрдо рдФрд░ рдЙрддреНрддрд░ рдмрдирд╛рдП рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЖрдЗрдП рд╕рд░реНрд╡рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ:


 from looseserver.server.rule import ServerRule class ServerParameterRule(ServerRule): def __init__(self, parameter_name, parameter_value=None, rule_type="PARAMETER"): super(ServerParameterRule, self).__init__(rule_type=rule_type) self._parameter_name = parameter_name self._parameter_value = parameter_value def is_match_found(self, request): if self._parameter_value is None: return self._parameter_name not in request.args return request.args.get(self._parameter_name) == self._parameter_value 

рдкреНрд░рддреНрдпреЗрдХ рдирд┐рдпрдо рдХреЛ рдПрдХ is_match_found рд╡рд┐рдзрд┐ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП, рдЬреЛ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреА рд╣реИ рдХрд┐ рдЙрд╕реЗ рджрд┐рдП рдЧрдП рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рдирд╣реАрдВред рдЗрд╕рдХреЗ рд▓рд┐рдП рдЗрдирдкреБрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдЕрдиреБрд░реЛрдз рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИред рдирдпрд╛ рдирд┐рдпрдо рдмрдирдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реЗ рдЗрд╕реЗ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡рд░ рдХреЛ "рд╕рд┐рдЦрд╛рдиреЗ" рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, RuleFactory рдЙрдкрдпреЛрдЧ RuleFactory :


 from looseserver.default.server.rule import create_rule_factory from looseserver.default.server.application import configure_application def _create_application(base_endpoint, configuration_endpoint): server_rule_factory = create_rule_factory(base_endpoint) def _parse_param_rule(rule_type, parameters): return ServerParameterRule( rule_type=rule_type, parameter_name=parameters["parameter_name"], parameter_value=parameters["parameter_value"], ) server_rule_factory.register_rule( rule_type="PARAMETER", parser=_parse_param_rule, serializer=lambda rule_type, rule: None, ) return configure_application( rule_factory=server_rule_factory, base_endpoint=base_endpoint, configuration_endpoint=configuration_endpoint, ) if __name__ == "__main__": application = _create_application(base_endpoint="/", configuration_endpoint="/_mock_configuration") application.run(host="127.0.0.1", port=80) 

рдпрд╣рд╛рдВ рд╣рдо рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рдпрдореЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рд░рдЦрд╛рдирд╛ рдмрдирд╛рддреЗ рд╣реИрдВ, рддрд╛рдХрд┐ рдЗрд╕рдореЗрдВ рд╡реЗ рдирд┐рдпрдо рд╢рд╛рдорд┐рд▓ рд╣реЛрдВ рдЬреЛ рд╣рдордиреЗ рдкрд╣рд▓реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдереЗ, рдФрд░ рдПрдХ рдирдпрд╛ рдкреНрд░рдХрд╛рд░ рдкрдВрдЬреАрдХреГрдд рдХрд░реЗрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдирд┐рдпрдо рдХреА рдЬрд╛рдирдХрд╛рд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП serializer рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЗрд╕ рдХрд╛рд░рдЦрд╛рдиреЗ рдХреЛ рдЖрд╡реЗрджрди рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдирд┐рдпрдорд┐рдд рдлреНрд▓рд╛рд╕реНрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рддрд░рд╣ рдЪрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд╕рд╛рде рд╕реНрдерд┐рддрд┐ рд╕рдорд╛рди рд╣реИ: рд╣рдо рдПрдХ рдирд┐рдпрдо рдФрд░ рдПрдХ рдХрд╛рд░рдЦрд╛рдирд╛ рдмрдирд╛рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд▓рд┐рдП, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ is_match_found рдкрджреНрдзрддрд┐ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ, рдФрд░ рджреВрд╕рд░реА рдмрд╛рдд, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдХреЛ рдирд┐рдпрдо рдХреЛ рд╕рд░реНрд╡рд░ рдкрд░ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред


 from looseserver.client.rule import ClientRule from looseserver.default.client.rule import create_rule_factory class ClientParameterRule(ClientRule): def __init__(self, parameter_name, parameter_value=None, rule_type="PARAMETER", rule_id=None): super(ClientParameterRule, self).__init__(rule_type=rule_type, rule_id=rule_id) self.parameter_name = parameter_name self.parameter_value = parameter_value def _create_client(configuration_url): def _serialize_param_rule(rule): return { "parameter_name": rule.parameter_name, "parameter_value": rule.parameter_value, } client_rule_factory = create_rule_factory() client_rule_factory.register_rule( rule_type="PARAMETER", parser=lambda rule_type, parameters: ClientParameterRule(rule_type=rule_type, parameter_name=None), serializer=_serialize_param_rule, ) return HTTPClient(configuration_url=configuration_url, rule_factory=client_rule_factory) 

рдпрд╣ рдЧреНрд░рд╛рд╣рдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП _create_client рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИ, рдФрд░ рдирд┐рдпрдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдореИрдВрдиреЗ рдПрдХ рдФрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдирд┐рдпрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдЬреЛрдбрд╝рд╛: CompositeRule ред рдпрд╣ рдЖрдкрдХреЛ рдХрдИ рдирд┐рдпрдореЛрдВ рдХреЛ рдПрдХ рдореЗрдВ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╡реЗ рдХреЗрд╡рд▓ рддрднреА рдХрд╛рдо рдХрд░реЗрдВ рдЬрдм рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдЯреНрд░реВ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рд╣реИред


 @pytest.fixture def configuration_server_mock(request): class MockFactory: def __init__(self): self._client = _create_client("http://127.0.0.1/_mock_configuration/") self._rule_ids = [] def create_paged_rule(self, path, page, json_response): rule_prototype = CompositeRule( children=[ PathRule(path=path), ClientParameterRule(parameter_name="page", parameter_value=page), ] ) rule = self._client.create_rule(rule_prototype) self._rule_ids.append(rule.rule_id) response = FixedResponse( headers={"Content-Type": "application/json"}, status=200, body=json.dumps(json_response), ) self._client.set_response(rule_id=rule.rule_id, response=response) ... mock = MockFactory() request.addfinalizer(mock._delete_rules) return mock def test_something(configuration_server_mock): ... configuration_server_mock.create_paged_rule( path="application-history", page=None, json_response=["1", "2", "3"], ) configuration_server_mock.create_paged_rule( path="application-history", page="1", json_response=["1", "2", "3"], ) configuration_server_mock.create_paged_rule( path="application-history", page="2", json_response=["4", "5"], ) 

рдирд┐рд╖реНрдХрд░реНрд╖


mitmproxy рдФрд░ mitmproxy pretenders рдПрдХ mitmproxy рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдФрд░ рд▓рдЪреАрд▓рд╛ рдкрд░реНрдпрд╛рдкреНрдд рдЙрдкрдХрд░рдг рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдлрд╛рдпрджреЗ:


  1. рдЖрд╕рд╛рди рд╕реЗрдЯрдЕрдкред
  2. рдкреНрд░реАрд╕реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреНрд╡реЗрд░реА рд╕реЗрдЯ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ред
  3. рдПрдХ рдмрд╛рд░ рдореЗрдВ рдПрдХ рдкреВрд░реЗ рдкреГрдердХ рд╕реЗрдЯ рдХреЛ рд╣рдЯрд╛рддрд╛ рд╣реИред

рд╡рд┐рдкрдХреНрд╖ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:


  1. рдирд┐рдпрдореЛрдВ рдХреЗ рд▓рд┐рдП рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ред
  2. рдирд┐рдпрдореЛрдВ рдХреЛ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдмрджрд▓рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрдерддрд╛ред
  3. рд╕рднреА рдирд┐рд░реНрдорд┐рдд рд░рд╛рд╕реНрддреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрд╕рд░реНрдЧ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдпрд╛ mitmproxy рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ mitmproxy ред

рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд▓рд┐рдВрдХ:
рдЙрдореНрдореАрджрд╡рд╛рд░
Mitmproxy
рдвреАрд▓рд╛ рд╕рд░реНрд╡рд░

Source: https://habr.com/ru/post/hi476904/


All Articles