File: connection_spec.rb

package info (click to toggle)
ruby-twitter 7.0.0-3
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 4,856 kB
  • sloc: ruby: 10,919; makefile: 6
file content (117 lines) | stat: -rw-r--r-- 3,528 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
require 'helper'

describe Twitter::Streaming::Connection do
  describe 'initialize' do
    context 'no options provided' do
      subject(:connection) { Twitter::Streaming::Connection.new }

      it 'sets the default socket classes' do
        expect(connection.tcp_socket_class).to eq TCPSocket
        expect(connection.ssl_socket_class).to eq OpenSSL::SSL::SSLSocket
      end
    end

    context 'custom socket classes provided in opts' do
      class DummyTCPSocket; end
      class DummySSLSocket; end

      subject(:connection) do
        Twitter::Streaming::Connection.new(tcp_socket_class: DummyTCPSocket, ssl_socket_class: DummySSLSocket)
      end

      it 'sets the default socket classes' do
        expect(connection.tcp_socket_class).to eq DummyTCPSocket
        expect(connection.ssl_socket_class).to eq DummySSLSocket
      end
    end
  end

  describe 'connection' do
    class DummyResponse
      def initiailze
        yield
      end

      def <<(data); end
    end

    subject(:connection) do
      Twitter::Streaming::Connection.new(tcp_socket_class: DummyTCPSocket, ssl_socket_class: DummySSLSocket)
    end

    let(:method) { :get }
    let(:uri)    { 'https://stream.twitter.com:443/1.1/statuses/sample.json' }
    let(:ssl_socket) { double('ssl_socket') }

    let(:request) { HTTP::Request.new(verb: method, uri: uri) }

    it 'requests via the proxy' do
      expect(connection.ssl_socket_class).to receive(:new).and_return(ssl_socket)
      allow(ssl_socket).to receive(:connect)

      expect(connection).to receive(:new_tcp_socket).with('stream.twitter.com', 443)
      connection.connect(request)
    end

    context 'when using a proxy' do
      let(:proxy) { {proxy_address: '127.0.0.1', proxy_port: 3328} }
      let(:request) { HTTP::Request.new(verb: method, uri: uri, proxy: proxy) }

      it 'requests via the proxy' do
        expect(connection).to receive(:new_tcp_socket).with('127.0.0.1', 3328)
        connection.connect(request)
      end

      context 'if using ssl' do
        subject(:connection) do
          Twitter::Streaming::Connection.new(tcp_socket_class: DummyTCPSocket, ssl_socket_class: DummySSLSocket, using_ssl: true)
        end

        it 'connect with ssl' do
          expect(connection.ssl_socket_class).to receive(:new).and_return(ssl_socket)
          allow(ssl_socket).to receive(:connect)

          expect(connection).to receive(:new_tcp_socket).with('127.0.0.1', 3328)
          connection.connect(request)
        end
      end
    end
  end

  describe 'stream' do
    subject(:connection) do
      Twitter::Streaming::Connection.new(tcp_socket_class: DummyTCPSocket, ssl_socket_class: DummySSLSocket)
    end

    let(:method) { :get }
    let(:uri)    { 'https://stream.twitter.com:443/1.1/statuses/sample.json' }
    let(:client) {  TCPSocket.new('127.0.0.1', 8443) }

    let(:request) { HTTP::Request.new(verb: method, uri: uri) }
    let(:response) { DummyResponse.new {} }

    before do
      @server = TCPServer.new('127.0.0.1', 8443)
    end

    after do
      @server.close
    end

    it 'close stream' do
      expect(connection).to receive(:connect).with(request).and_return(client)
      expect(request).to receive(:stream).with(client)

      stream_closed = false
      t = Thread.start do
        connection.stream(request, response)
        stream_closed = true
      end
      expect(stream_closed).to be false
      sleep 1
      connection.close
      t.join
      expect(stream_closed).to be true
    end
  end
end