class OpenTokStreamTest(unittest.TestCase):
    def setUp(self):
        self.api_key = u('123456')
        self.api_secret = u('1234567890abcdef1234567890abcdef1234567890')
        self.opentok = OpenTok(self.api_key, self.api_secret)
        self.session_id = u('SESSIONID')
        self.stream_id = u('8b732909-0a06-46a2-8ea8-074e64d43422')

    @httpretty.activate
    def test_get_stream(self):
        stream = Stream({
            u('id'): u('8b732909-0a06-46a2-8ea8-074e64d43422'),
            u('videoType'): u('camera'),
            u('name'): u(''),
            u('layoutClassList'): ['full']
        })

        httpretty.register_uri(
            httpretty.GET,
            u('https://api.opentok.com/v2/project/{0}/session/{1}/stream/{2}'
              ).format(self.api_key, self.session_id, self.stream_id),
            body=textwrap.dedent(
                u("""\
                   {
                      "id": "8b732909-0a06-46a2-8ea8-074e64d43422",
                      "videoType": "camera",
                      "name": "",
                      "layoutClassList": ["full"]
                    }""")),
            status=200,
            content_type=u('application/json'))

        stream_response = self.opentok.get_stream(self.session_id,
                                                  self.stream_id)
        validate_jwt_header(
            self,
            httpretty.last_request().headers[u('x-opentok-auth')])
        expect(httpretty.last_request().headers[u('user-agent')]).to(
            contain(u('OpenTok-Python-SDK/') + __version__))
        expect(httpretty.last_request().headers[u('content-type')]).to(
            equal(u('application/json')))
        expect(stream_response).to(be_an(Stream))
        expect(stream_response).to(have_property(u('id'), stream.id))
        expect(stream_response).to(
            have_property(u('videoType'), stream.videoType))
        expect(stream_response).to(have_property(u('name'), stream.name))
        expect(stream_response).to(
            have_property(u('layoutClassList'), stream.layoutClassList))
        expect(list(stream_response.layoutClassList)).to(have_length(1))

    @httpretty.activate
    def test_get_stream_with_name(self):
        stream = Stream({
            u('id'): u('8b732909-0a06-46a2-8ea8-074e64d43422'),
            u('videoType'): u('camera'),
            u('name'): u('stream name'),
            u('layoutClassList'): ['full']
        })

        httpretty.register_uri(
            httpretty.GET,
            u('https://api.opentok.com/v2/project/{0}/session/{1}/stream/{2}'
              ).format(self.api_key, self.session_id, self.stream_id),
            body=textwrap.dedent(
                u("""\
                   {
                      "id": "8b732909-0a06-46a2-8ea8-074e64d43422",
                      "videoType": "camera",
                      "name": "stream name",
                      "layoutClassList": ["full"]
                    }""")),
            status=200,
            content_type=u('application/json'))

        stream_response = self.opentok.get_stream(self.session_id,
                                                  self.stream_id)
        validate_jwt_header(
            self,
            httpretty.last_request().headers[u('x-opentok-auth')])
        expect(httpretty.last_request().headers[u('user-agent')]).to(
            contain(u('OpenTok-Python-SDK/') + __version__))
        expect(httpretty.last_request().headers[u('content-type')]).to(
            equal(u('application/json')))
        expect(stream_response).to(be_an(Stream))
        expect(stream_response).to(have_property(u('id'), stream.id))
        expect(stream_response).to(
            have_property(u('videoType'), stream.videoType))
        expect(stream_response).to(have_property(u('name'), stream.name))
        expect(stream_response).to(
            have_property(u('layoutClassList'), stream.layoutClassList))
        expect(list(stream_response.layoutClassList)).to(have_length(1))

    @httpretty.activate
    def test_get_stream_list(self):
        httpretty.register_uri(
            httpretty.GET,
            u('https://api.opentok.com/v2/project/{0}/session/{1}/stream'
              ).format(self.api_key, self.session_id),
            body=textwrap.dedent(
                u("""\
                   {
                      "count": 2,
                      "items": [
                        {
                          "id": "8b732909-0a06-46a2-8ea8-074e64d43422",
                          "videoType": "camera",
                          "name": "stream1",
                          "layoutClassList": ["full"]
                        },
                        {
                          "id": "7b732909-0a06-46a2-8ea8-074e64d43423",
                          "videoType": "camera",
                          "name": "stream2",
                          "layoutClassList": ["full"]
                        }
                      ]
                    }""")),
            status=200,
            content_type=u('application/json'))

        stream_list = self.opentok.list_streams(self.session_id)
        validate_jwt_header(
            self,
            httpretty.last_request().headers[u('x-opentok-auth')])
        expect(httpretty.last_request().headers[u('user-agent')]).to(
            contain(u('OpenTok-Python-SDK/') + __version__))
        expect(httpretty.last_request().headers[u('content-type')]).to(
            equal(u('application/json')))
        expect(stream_list).to(be_an(StreamList))
        expect(stream_list).to(have_property(u('count'), 2))
        expect(list(stream_list.items)).to(have_length(2))

    @httpretty.activate
    def test_set_stream_class_lists(self):
        """ Test set stream class functionality """
        payload = [{
            'id': '7b09ec3c-26f9-43d7-8197-f608f13d4fb6',
            'layoutClassList': ['focus']
        }, {
            'id': '567bc941-6ea0-4c69-97fc-70a740b68976',
            'layoutClassList': ['top']
        }, {
            'id': '307dc941-0450-4c09-975c-705740d08970',
            'layoutClassList': ['bottom']
        }]

        httpretty.register_uri(
            httpretty.PUT,
            u('https://api.opentok.com/v2/project/{0}/session/{1}/stream'
              ).format(self.api_key, self.session_id),
            status=200,
            content_type=u('application/json'))

        self.opentok.set_stream_class_lists(self.session_id, payload)

        validate_jwt_header(
            self,
            httpretty.last_request().headers[u('x-opentok-auth')])
        expect(httpretty.last_request().headers[u('user-agent')]).to(
            contain(u('OpenTok-Python-SDK/') + __version__))
        expect(httpretty.last_request().headers[u('content-type')]).to(
            equal(u('application/json')))

    @httpretty.activate
    def test_set_stream_class_lists_throws_exception(self):
        """ Test invalid request in set stream class list """

        #invalid payload
        payload = [{'id': '7b09ec3c-26f9-43d7-8197-f608f13d4fb6'}]

        httpretty.register_uri(
            httpretty.PUT,
            u('https://api.opentok.com/v2/project/{0}/session/{1}/stream'
              ).format(self.api_key, self.session_id),
            status=400,
            content_type=u('application/json'))

        self.assertRaises(SetStreamClassError,
                          self.opentok.set_stream_class_lists, self.session_id,
                          payload)