Mocked API server

# coding=utf8
from __future__ import unicode_literals
import threading
import time
import json
import requests
from werkzeug.serving import run_simple
from werkzeug.wrappers import Request, Response
from tests.mock import pickup_port
from zerotest.utils.generator_helper import get_name_from_request
from zerotest.utils.url_helper import urljoin


class Server(object):
    def __init__(self):
        self.count = 0
        self.host = None
        self.port = None
        self.thread = None
        self.running = False

    def dispatch_request(self, request):
        handler = getattr(self, get_name_from_request(request), None)
        if handler:
            return handler(request)
        else:
            return Response("non route", status=404)

    def get_count(self, request):
        return Response(json.dumps(dict(count=self.count)),
                        content_type='application/json; charset=utf-8')

    def post_echo(self, request):
        return Response(request.data,
                        content_type=request.headers['content_type'])

    def post_raw_to_json(self, request):
        data = request.data
        return Response(data,
                        content_type='application/json')

    def get_chinese_hello_world(self, request):
        return Response(json.dumps(dict(count=self.count, content="你好,世界")),
                        content_type='application/json; charset=utf-8')

    def delete_shutdown_server(self, request):
        func = request.environ.get('werkzeug.server.shutdown')
        if func is None:
            raise RuntimeError('Not running with the Werkzeug Server')
        func()
        return Response("shutdown")

    def __call__(self, environ, start_response):
        request = Request(environ)
        self.count += 1
        environ['HTTP_COUNT'] = self.count
        return self.dispatch_request(request)(environ, start_response)

    def start(self, host, port):
        self.host = host
        self.port = port
        self.running = True
        run_simple(host, port, self)

    @property
    def url(self):
        return 'http://{}:{}'.format(self.host, self.port)

    def start_daemon(self, host, port):
        self.thread = threading.Thread(target=lambda: self.start(host, port))
        self.thread.start()

    def shutdown(self):
        if self.running:
            requests.delete(urljoin(self.url, 'shutdown_server'))
            self.running = False
            self.thread.join(30)

    def start_mock_server(self):
        port = pickup_port()
        self.start_daemon('127.0.0.1', port)
        test_count = 10
        while test_count > 0:
            try:
                if self.running:
                    r = requests.get(urljoin(self.url, '/count'))
                    if r.status_code == 200:
                        return

                    print("wait server start, response", r.status_code, r.text)
            except requests.exceptions.ConnectionError:
                pass

            time.sleep(1)
            test_count -= 1
        else:
            self.shutdown()
            raise RuntimeError("start mock server timeout")
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市爆价,隨后出現(xiàn)的幾起案子趾盐,更是在濱河造成了極大的恐慌,老刑警劉巖吭露,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件计露,死亡現(xiàn)場(chǎng)離奇詭異蔫敲,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)驻谆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門卵凑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人胜臊,你說我怎么就攤上這事氛谜。” “怎么了区端?”我有些...
    開封第一講書人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵值漫,是天一觀的道長。 經(jīng)常有香客問我织盼,道長杨何,這世上最難降的妖魔是什么酱塔? 我笑而不...
    開封第一講書人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮蕊玷,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘弥雹。我一直安慰自己垃帅,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開白布剪勿。 她就那樣靜靜地躺著贸诚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪厕吉。 梳的紋絲不亂的頭發(fā)上酱固,一...
    開封第一講書人閱讀 52,682評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音头朱,去河邊找鬼。 笑死班眯,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的寄纵。 我是一名探鬼主播,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼脖苏,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼程拭!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起亦歉,我...
    開封第一講書人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤恤浪,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后肴楷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體水由,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年赛蔫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了砂客。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片泥张。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖鞠值,靈堂內(nèi)的尸體忽然破棺而出媚创,到底是詐尸還是另有隱情,我是刑警寧澤彤恶,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布钞钙,位于F島的核電站,受9級(jí)特大地震影響声离,放射性物質(zhì)發(fā)生泄漏芒炼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一抵恋、第九天 我趴在偏房一處隱蔽的房頂上張望焕议。 院中可真熱鬧,春花似錦弧关、人聲如沸盅安。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽别瞭。三九已至,卻和暖如春株憾,著一層夾襖步出監(jiān)牢的瞬間蝙寨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來泰國打工嗤瞎, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留墙歪,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓贝奇,卻偏偏與公主長得像虹菲,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子掉瞳,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容