рдЖрдЬ рд╣рдо рдкрд░реАрдХреНрд╖рдг рдХреЛрдб рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдХреЛрдб рдЦреЛрд▓рддреЗ рд╣реИрдВ, HTTP рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд░реВрдкрд░реЗрдЦрд╛, рдЬрд┐рд╕реЗ Yandex.Taxi рджреНрд╡рд╛рд░рд╛ рд╡рд┐рдХрд╕рд┐рдд рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред GITHub рдкрд░ MIT рд▓рд╛рдЗрд╕реЗрдВрд╕ рдХреЗ рддрд╣рдд рд╕реНрд░реЛрдд рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ редTestuite рдХреЗ рд╕рд╛рде, HTTP рд╕реЗрд╡рд╛рдУрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рдпрд╣ рддреИрдпрд╛рд░ рддрдВрддреНрд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ:Yandex.Taxi рдмреИрдХрдПрдВрдб рдореЗрдВ рд╕реИрдХрдбрд╝реЛрдВ рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕реЗрдЬ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдирдП рд▓рдЧрд╛рддрд╛рд░ рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣реЗ рд╣реИрдВред рд╣рдо рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдврд╛рдВрдЪреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ C ++ рдореЗрдВ рд╕рднреА рдЕрддреНрдпрдзрд┐рдХ рднрд░реА рд╣реБрдИ рд╕реЗрд╡рд╛рдУрдВ рдХрд╛ рд╡рд┐рдХрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ Habr├й рд╕реЗ рдмрд╛рдд рдХреА рд╣реИ ред рд╣рдо рдкрд╛рдпрдерди рдореЗрдВ рдХрдо рдорд╛рдВрдЧ рд╡рд╛рд▓реА рд╕реЗрд╡рд╛рдПрдВ рдФрд░ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдмрдирд╛рддреЗ рд╣реИрдВредрдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╕реЗрд╡рд╛ рдЕрдкрдиреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╣рд▓ рдХрд░рддреА рд╣реИ, рдЕрдиреНрдп рд╕реЗрд╡рд╛рдУрдВ рдФрд░ рдЕрдВрддрд┐рдо рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдПрдкреАрдЖрдИ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдЗрд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдПрдХ рдмреНрд▓реИрдХ рдмреЙрдХреНрд╕ рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдкрд░ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВредрдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЛрдИ рддреИрдпрд╛рд░ рдЙрдкрдХрд░рдг рдирд╣реАрдВ рд╣реИрдВ - рдЖрдкрдХреЛ рдкрд░реАрдХреНрд╖рдг рд╡рд╛рддрд╛рд╡рд░рдг рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛, рдЬреЛ рд╣реЛрдЧрд╛:- рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдмрдврд╝рд╛рдПрдВ рдФрд░ рднрд░реЗрдВ;
- рдЕрд╡рд░реЛрдзрди рдФрд░ рд╕реНрдкреВрдл HTTP рдЕрдиреБрд░реЛрдз;
- рдЗрд╕ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдПрдХ рдкрд░реАрдХреНрд╖рдг рд╕реЗрд╡рд╛ рдЪрд▓рд╛рдПрдВред
рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЪреМрдЦрдЯреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░рдирд╛ рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рдФрд░ рдЧрд▓рдд рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЙрдирдХрд╛ рдХрд╛рд░реНрдп рдЕрд▓рдЧ рд╣реИ: рдЫреЛрдЯреЗ рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдЗрдХрд╛рдЗрдпреЛрдВ рдХреЗ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг - рдШрдЯрдХ, рд╡рд░реНрдЧ, рдХрд╛рд░реНрдпредрдЯреЗрд╕реНрдЯрд╕реБрдЗрдЯ рдкрд╛рдЗрдЯреЗрд╕реНрдЯ , рдорд╛рдирдХ рдкрд╛рдпрдерди рдкрд░реАрдХреНрд╖рдг рдврд╛рдВрдЪреЗ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ ред рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рд╣рдо рдЬрд┐рд╕ рдорд╛рдЗрдХреНрд░реЛрд╕реЗрд╡реНрд╕ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ рдХрд┐рд╕ рднрд╛рд╖рд╛ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред рдЕрдм рдЯреЗрд╕реНрдЯрд╕реБрдЗрдЯ GNU / Linux, macOS рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдкрд░ рдЪрд▓рддрд╛ рд╣реИредрд╣рд╛рд▓рд╛рдВрдХрд┐ рдЯреЗрд╕реНрдЯрд╕реБрдЗрдЯ рдПрдХреАрдХрд░рдг рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рдЕрд░реНрдерд╛рдд, рдХрдИ рд╕реЗрд╡рд╛рдУрдВ рдХреА рдмрд╛рддрдЪреАрдд (рдФрд░ рдпрджрд┐ рд╕реЗрд╡рд╛ рдкрд╛рдпрдерди рдореЗрдВ рд▓рд┐рдЦреА рдЧрдИ рд╣реИ, рддреЛ рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП), рд╣рдо рдЗрди рдорд╛рдорд▓реЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рдХреЗрд╡рд▓ рдПрдХ рд╣реА рд╕реЗрд╡рд╛ рдХреЗ рдкрд░реАрдХреНрд╖рдг рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реЗрдВрдЧреЗредрдкрд░рд┐рдЪрд╛рд▓рди рд╕рд┐рджреНрдзрд╛рдВрдд
рдЕрдВрддрд┐рдо рд▓рдХреНрд╖реНрдп рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рд╣реИ рдХрд┐ рд╕реЗрд╡рд╛ HTTP рдХреЙрд▓ рдХрд╛ рд╕рд╣реА рдЙрддреНрддрд░ рджреЗрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо HTTP рдХреЙрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╣реИрдВредрдХрд┐рд╕реА рд╕реЗрд╡рд╛ рдХреЛ рд╢реБрд░реВ рдХрд░рдирд╛ / рд░реЛрдХрдирд╛ рдПрдХ рд░реВрдЯреАрди рдСрдкрд░реЗрд╢рди рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЬрд╛рдБрдЪ рдХрд░рддреЗ рд╣реИрдВ:- рд╕реЗрд╡рд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж HTTP рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рддрд╛ рд╣реИ;
- рдпрджрд┐ рдмрд╛рд╣рд░реА рд╕реЗрд╡рд╛рдПрдБ рдЕрд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ рдЕрдиреБрдкрд▓рдмреНрдз рд╣реИрдВ рддреЛ рд╕реЗрд╡рд╛ рдХреИрд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддреА рд╣реИред

рдкрд░реАрдХреНрд╖рдг рд╕реВрдЯ:- рдбреЗрдЯрд╛рдмреЗрд╕ (PostgreSQL, MongoDB ...) рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИред
- рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рдг рд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛ рд╕реЗ рднрд░ рджреЗрддрд╛ рд╣реИред
- рдПрдХ рдЕрд▓рдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдП рдЧрдП microservice рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИред
- рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рд╡реЗрдм рд╕рд░реНрд╡рд░ (рдореЙрдХрд╕реЗрд╡рд░) рд▓реЙрдиреНрдЪ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП рдмрд╛рд╣рд░реА рд╡рд╛рддрд╛рд╡рд░рдг рдХреА рдирдХрд▓ рдХрд░рддрд╛ рд╣реИред
- рдкрд░реАрдХреНрд╖рдг рдХрд░рддрд╛ рд╣реИред
рдкрд░реАрдХреНрд╖рдг рдХреА рдЬрд╛рдБрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:- рдХреНрдпрд╛ рд╕реЗрд╡рд╛ HTTP рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдВрднрд╛рд▓рддреА рд╣реИред
- рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╕реЗрд╡рд╛ рд╕реАрдзреЗ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИред
- рдмрд╛рд╣реНрдп рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ / рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ / рдЕрдиреБрдХреНрд░рдоред
- рд╕реЗрд╡рд╛ рдХреА рдЖрдВрддрд░рд┐рдХ рд╕реНрдерд┐рддрд┐ рдЙрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЬреЛ рд╡рд╣ рдЯреЗрд╕реНрдЯрдкреЙрдЗрдВрдЯ рдХреЛ рдкрд╛рд╕ рдХрд░рддреА рд╣реИред
mockserver
рд╣рдо рдПрдХ рдПрдХрд▓ рдорд╛рдЗрдХреНрд░реЛрд╕рд┐рд╕реНрдЯ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╣реИрдВред рдмрд╛рд╣рд░реА рд╕реЗрд╡рд╛рдУрдВ рдХреЗ HTTP API рдХреА рдХреЙрд▓ рдХреЛ рдмреНрд░рд┐рдЬ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдХрд╛рдо рдХреЗ рдЗрд╕ рднрд╛рдЧ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдкреНрд▓рдЧ-рдЗрди mockserver
рдФрд░ рдорд┐рд▓рддреЗ рд╣реИрдВ mockserver_https
ред Mockserver рдЕрдиреБрд░реЛрдз рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд╕рд╛рде рдПрдХ HTTP рд╕рд░реНрд╡рд░ рд╣реИ рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рдг рдФрд░ рдореЗрдореЛрд░реА рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рди рдпреЛрдЧреНрдп рд╣реИ рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдиреБрд░реЛрдз рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдХреНрдпрд╛ рдбреЗрдЯрд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИредрдбреЗрдЯрд╛рдмреЗрд╕
рдЯреЗрд╕реНрдЯрд╕реБрдЗрдЯ рдкрд░реАрдХреНрд╖рдг рдХреЛ рдкрдврд╝рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛рдмреЗрд╕ рддрдХ рд╕реАрдзреЗ рдкрд╣реБрдВрдЪрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдкреВрд░реНрд╡ рд╢рд░реНрдд рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдЙрдЯ рдСрдл рдж рдмреЙрдХреНрд╕ рд╕рдорд░реНрдерд┐рдд PostgreSQL, MongoDB, RedisредрдХреИрд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВ
рдЯреЗрд╕реНрдЯрд╕реБрдЗрдЯ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдкрд╛рдпрдерди рдФрд░ рдорд╛рдирдХ рдкрд╛рдЗрд╕реНрдЯреЗрд╕реНрдЯ рдлреНрд░реЗрдорд╡рд░реНрдХ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП редрдЪрд▓реЛ рдПрдХ рд╕рд░рд▓ рдЪреИрдЯ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЯреЗрд╕реНрдЯрд╕реБрдЗрдЯ рдХрджрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЖрд╡реЗрджрди рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдХреЛрдб рдпрд╣рд╛рдВ рджрд┐рдП рдЧрдП рд╣реИрдВ ред
рджреГрд╢реНрдпрдкрдЯрд▓ chat.html рд╕рд╛рде рд╕реВрдЪрдирд╛ рдХрд╛ рдЖрджрд╛рди рдЪреИрдЯ-рдмреИрдХрдПрдВрдб рд╕реЗрд╡рд╛ редрдпрд╣ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреИрд╕реЗ рд╕реЗрд╡рд╛рдПрдВ рд╕рд╣рднрд╛рдЧрд┐рддрд╛ рдХрд░рддреА рд╣реИрдВ, рдЪреИрдЯ-рдмреИрдХреЗрдВрдб рдкреНрд░рддрд┐рдирд┐рдзрд┐ рд╕рдВрджреЗрд╢ рдХреЛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╕реЗрд╡рд╛ рдореЗрдВ рднреЗрдЬ рджреЗрддрд╛ рд╣реИред рд╕реНрдЯреЛрд░реЗрдЬ рдХреЛ рджреЛ рддрд░рд╣ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЪреИрдЯ-рд╕реНрдЯреЛрд░реЗрдЬ-рдореЛрдВрдЧреЛ рдФрд░ рдЪреИрдЯ-рд╕реНрдЯреЛрд░реЗрдЬ-рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ редрдЪреИрдЯ рдмреИрдХреЗрдВрдб
рдЪреИрдЯ-рдмреИрдХреЗрдВрдб рд╕реЗрд╡рд╛ рдлреНрд░рдВрдЯ-рдПрдВрдб рд╕реЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рд╣реИред рд╕рдВрджреЗрд╢реЛрдВ рдХреА рд╕реВрдЪреА рднреЗрдЬрдиреЗ рдФрд░ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо редрд╕рд░реНрд╡рд┐рд╕
рд╣рдо рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЕрдиреБрд░реЛрдз рд╣реИрдВрдбрд▓рд░ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ POST /messages/retrieve
:рд╕реНрд░реЛрдд рдХреЛрдб@routes.post('/messages/retrieve')
async def handle_list(request):
async with aiohttp.ClientSession() as session:
response = await session.post(
storage_service_url + 'messages/retrieve',
timeout=HTTP_TIMEOUT,
)
response.raise_for_status()
response_body = await response.json()
messages = list(reversed(response_body['messages']))
result = {'messages': messages}
return web.json_response(result)
рдЯреЗрд╕реНрдЯ
рд╕реЗрд╡рд╛ рдХреЗ рд▓реЙрдиреНрдЪ рдХреЗ рд▓рд┐рдП рдЯреЗрд╕реНрдЯрд╕реБрдЗрдЯ рдЗрдиреНрдлреНрд░рд╛рд╕реНрдЯреНрд░рдХреНрдЪрд░ рддреИрдпрд╛рд░ рдХрд░реЗрдВред рд╣рдо рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рд╕реЗрд╡рд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреМрди рд╕реА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдЪрд╛рд╣рддреЗ рд╣реИрдВредрд╕реНрд░реЛрдд
@pytest.fixture(scope='session')
async def service_daemon(
register_daemon_scope, service_spawner, mockserver_info,
):
python_path = os.getenv('PYTHON3', 'python3')
service_path = pathlib.Path(__file__).parent.parent
async with register_daemon_scope(
name='chat-backend',
spawn=service_spawner(
[
python_path,
str(service_path.joinpath('server.py')),
'--storage-service-url',
mockserver_info.base_url + 'storage/',
],
check_url=SERVICE_BASEURL + 'ping',
),
) as scope:
yield scope
рд╣рдо рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реНрдерд┐рд░рддрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд░реАрдХреНрд╖рдг рд╕реЗрд╡рд╛ рдХреЛ рдПрдХ HTTP рдЕрдиреБрд░реЛрдз рднреЗрдЬрддрд╛ рд╣реИредрд╕реНрд░реЛрдд@pytest.fixture
async def server_client(
service_daemon,
service_client_options,
ensure_daemon_started,
mockserver,
):
await ensure_daemon_started(service_daemon)
yield service_client.Client(SERVICE_BASEURL, **service_client_options)
рдЕрдм рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪрд╛ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдХреИрд╕реЗ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЬрд╛рдП chat-backend
рдФрд░ рдХреИрд╕реЗ рдЙрд╕реЗ рдПрдХ рдЕрдиреБрд░реЛрдз рднреЗрдЬрд╛ рдЬрд╛рдПред рдпрд╣ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИредрдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ chat-backend
рд╣рдо рднрдВрдбрд╛рд░рдг рд╕реЗрд╡рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рди chat-storage-mongo
рд╣реА , рди рд╣реА chat-storage-postgres
ред chat-backend
рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдХреЙрд▓ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП , рд╣рдордиреЗ рд╕реНрдЯреЛрд░реЗрдЬ рдПрдкреАрдЖрдИ рдХреЛ рдЧреАрд▓рд╛ рдХрд░ рджрд┐рдпрд╛ рд╣реИ mockserver
редрдЖрдЗрдП рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦреЗрдВ POST messages/send
ред рд╣рдо рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ:- рдЕрдиреБрд░реЛрдз рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ;
- рдЕрдиреБрд░реЛрдз рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╕рдордп,
chat-backend
рд╕рдВрдЧреНрд░рд╣рдг рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ POST messages/send
ред
рд╕реНрд░реЛрддasync def test_messages_send(server_client, mockserver):
@mockserver.handler('/storage/messages/send')
async def handle_send(request):
assert request.json == {
'username': 'Bob',
'text': 'Hello, my name is Bob!',
}
return mockserver.make_response(status=204)
response = await server_client.post(
'messages/send',
json={'username': 'Bob', 'text': 'Hello, my name is Bob!'},
)
assert response.status == 204
assert handle_send.times_called == 1
рдЖрдЗрдП рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦреЗрдВ POST messages/retrieve
ред рд╣рдо рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ:- рдЕрдиреБрд░реЛрдз рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ;
- рдЕрдиреБрд░реЛрдз рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╕рдордп,
chat-backend
рд╕рдВрдЧреНрд░рд╣рдг рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ POST /messages/retrieve
; chat-backend
"рдлрд╝реНрд▓рд┐рдкреНрд╕" рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╕рдВрджреЗрд╢реЛрдВ рдХреА рд╕реВрдЪреА рддрд╛рдХрд┐ рдирд╡реАрдирддрдо рд╕рдВрджреЗрд╢ рд╕реВрдЪреА рдХреЗ рдЕрдВрдд рдореЗрдВ рд╣реЛрдВред
рд╕реНрд░реЛрддasync def test_messages_retrieve(server_client, mockserver):
messages = [
{
'username': 'Bob',
'created': '2020-01-01T12:01:00.000',
'text': 'Hi, my name is Bob!',
},
{
'username': 'Alice',
'created': {'$date': '2020-01-01T12:02:00.000'},
'text': 'Hi Bob!',
},
]
@mockserver.json_handler('/storage/messages/retrieve')
async def handle_retrieve(request):
return {'messages': messages}
response = await server_client.post('messages/retrieve')
assert response.status == 200
body = response.json()
assert body == {'messages': list(reversed(messages))}
assert handle_retrieve.times_called == 1
рдЪреИрдЯ-рднрдВрдбрд╛рд░рдг-postgres
рд╕реЗрд╡рд╛ chat-storage-postgres
рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдПрд╕рдХреНрдпреВрдПрд▓ рдбреЗрдЯрд╛рдмреЗрд╕ рдкрд░ рдЪреИрдЯ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдкрдврд╝рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИредрд╕рд░реНрд╡рд┐рд╕
рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдХреИрд╕реЗ рд╡рд┐рдзрд┐ рдореЗрдВ PostgreSQL рд╕реЗ рд╕рдВрджреЗрд╢реЛрдВ рдХреА рд╕реВрдЪреА рдкрдврд╝рддреЗ рд╣реИрдВ POST /messages/retrieve
:рд╕реНрд░реЛрдд рдХреЛрдб@routes.post('/messages/retrieve')
async def get(request):
async with app['pool'].acquire() as connection:
records = await connection.fetch(
'SELECT created, username, "text" FROM messages '
'ORDER BY created DESC LIMIT 20',
)
messages = [
{
'created': record[0].isoformat(),
'username': record[1],
'text': record[2],
}
for record in records
]
return web.json_response({'messages': messages})
рдЯреЗрд╕реНрдЯ
рд╣рдо рдЬрд┐рд╕ рд╕реЗрд╡рд╛ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ PostgreSQL рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИред рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдпрд╣ рдмрддрд╛рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рдХрд┐ рдЯреЗрдмрд▓ рд╕реНрдХреАрдорд╛ рдХреА рддрд▓рд╛рд╢ рдХреЗ рд▓рд┐рдП рдХреМрди рд╕реА рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рд╣реИредрд╕реНрд░реЛрдд@pytest.fixture(scope='session')
def pgsql_local(pgsql_local_create):
tests_dir = pathlib.Path(__file__).parent
sqldata_path = tests_dir.joinpath('../schemas/postgresql')
databases = discover.find_databases('chat_storage_postgres', sqldata_path)
return pgsql_local_create(list(databases.values()))
рдмрд╛рдХреА рдХрдВрдлрд╝реЗрд╕реНрдЯрд╕реНрдЯреЙрдХрд╣реЛрдо рдЗрдиреНрдлреНрд░рд╛рд╕реНрдЯреНрд░рдХреНрдЪрд░ рд╕реЗрдЯрдЕрдк рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╕реЗрд╡рд╛ рд╕реЗ рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реИ chat-backend
редрдЪрд▓рд┐рдП рдкрд░реАрдХреНрд╖рдгреЛрдВ рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВредрдЖрдЗрдП рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦреЗрдВ POST messages/send
ред рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдпрд╣ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рд╕рдВрджреЗрд╢ рдмрдЪрд╛рддрд╛ рд╣реИредрд╕реНрд░реЛрддasync def test_messages_send(server_client, pgsql):
response = await server_client.post(
'/messages/send', json={'username': 'foo', 'text': 'bar'},
)
assert response.status_code == 200
data = response.json()
assert 'id' in data
cursor = pgsql['chat_messages'].cursor()
cursor.execute(
'SELECT username, text FROM messages WHERE id = %s', (data['id'],),
)
record = cursor.fetchone()
assert record == ('foo', 'bar')
рдЖрдЗрдП рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦреЗрдВ POST messages/retrieve
ред рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдпрд╣ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рд╕рдВрджреЗрд╢ рд▓реМрдЯрд╛рддрд╛ рд╣реИредрд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмрдирд╛рдПрдВ рдЬреЛ рд╣рдореЗрдВ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд░рд┐рдХреЙрд░реНрдб рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдЯреЗрд╕реНрдЯрд╕реБрдЗрдЯ рдкрд░реАрдХреНрд╖рдг рд╕реЗ рдкрд╣рд▓реЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдЧрд╛редрд╕реНрд░реЛрдд
INSERT INTO messages(id, created, username, text) VALUES (DEFAULT, '2020-01-01 00:00:00.0+03', 'foo', 'hello, world!');
INSERT INTO messages(id, created, username, text) VALUES (DEFAULT, '2020-01-01 00:00:01.0+03', 'bar', 'happy ny');
рд╕реНрд░реЛрдд
async def test_messages_retrieve(server_client, pgsql):
response = await server_client.post('/messages/retrieve', json={})
assert response.json() == {
'messages': [
{
'created': '2019-12-31T21:00:01+00:00',
'text': 'happy ny',
'username': 'bar',
},
{
'created': '2019-12-31T21:00:00+00:00',
'text': 'hello, world!',
'username': 'foo',
},
],
}
рдкреНрд░рдХреНрд╖реЗрдкрдг
рдбреЙрдХрдЯрд░ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рд░рдирд┐рдВрдЧ рдЙрджрд╛рд╣рд░рдг рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдорд╢реАрди рдкрд░ рд╕реНрдерд╛рдкрд┐рдд рдбреЙрдХрдЯрд░ рдФрд░ рдбреЙрдХрдЯрд░-рдХрдВрдкреЛрдЬрд╝ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИредрд╕рднреА рдЙрджрд╛рд╣рд░рдг рдкреНрд░рд╛рд░рдВрдн рдЪреИрдЯ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕реЗ рд▓реЙрдиреНрдЪ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВредdocs/examples
docs/examples$ make run-chat-mongo
docs/examples$ make run-chat-postgres
рд▓реЙрдиреНрдЪ рдХреЗ рдмрд╛рдж, URL рдХрдВрд╕реЛрд▓ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдЧрд╛, рдЬрд╣рд╛рдБ рдЖрдк рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЪреИрдЯ рдЦреЛрд▓ рд╕рдХрддреЗ рд╣реИрдВ:chat-postgres_1 | ======== Running on http://0.0.0.0:8081 ========
chat-postgres_1 | (Press CTRL+C to quit)
рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдПрдВ
docs/examples$ make docker-runtests
docs/examples$ make docker-runtests-mockserver-example
docs/examples$ make docker-runtests-mongo-example
docs/examples$ make docker-runtests-postgres-example
рдкреНрд░рд▓реЗрдЦрди
рд╡рд┐рд╕реНрддреГрдд рдкрд░реАрдХреНрд╖рдгрд╕реВрдЪрдирд╛ рдкреНрд░рд▓реЗрдЦрди рдпрд╣рд╛рдБ рдЙрдкрд▓рдмреНрдз рд╣реИ ред рдЙрджрд╛рд╣рд░рдг рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдФрд░ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдПрдирд┐рд░реНрджреЗрд╢ редрдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкреНрд░рд╢реНрди рд╣реИрдВ github.com/yandex/yandex-taxi-testsuite/issues - рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЫреЛрдбрд╝ рджреЗрдВред