aemo 0.5.1 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5,37 +5,39 @@ require 'spec_helper'
5
5
  describe AEMO::MSATS do
6
6
  describe 'instance methods' do
7
7
  it 'creates a new instance' do
8
- expect(AEMO::MSATS.new.class).to eq(AEMO::MSATS)
8
+ expect(described_class.new.class).to eq(described_class)
9
9
  end
10
10
  end
11
11
 
12
12
  describe 'class methods' do
13
13
  describe 'nmi details' do
14
14
  describe 'valid MSATS user' do
15
- before(:each) do
16
- AEMO::MSATS.authorize('ER', 'ER', 'ER')
15
+ before do
16
+ described_class.authorize('ER', 'ER', 'ER')
17
17
  end
18
18
 
19
- it 'should get data for a valid nmi' do
20
- nmi_detail_query = AEMO::MSATS.nmi_detail('4001234567')
19
+ it 'gets data for a valid nmi' do
20
+ nmi_detail_query = described_class.nmi_detail('4001234567')
21
21
  expect(nmi_detail_query.class).to eq(Hash)
22
22
  end
23
- it 'should get a 404 for a nonexistent nmi' do
23
+
24
+ it 'gets a 404 for a nonexistent nmi' do
24
25
  # nmi_detail_query = AEMO::MSATS.nmi_detail('4001234566')
25
26
  # TODO workout what the different errors are here...
26
27
  end
27
- it 'should raise an error for a bad nmi' do
28
- expect { AEMO::MSATS.nmi_detail('BOBISAFISH') }.to raise_error(ArgumentError)
28
+
29
+ it 'raises an error for a bad nmi' do
30
+ expect { described_class.nmi_detail('BOBISAFISH') }.to raise_error(ArgumentError)
29
31
  end
30
32
  end
31
33
 
32
34
  describe 'invalid MSATS user' do
33
- before(:each) do
34
- AEMO::MSATS.authorize('NOTER', 'NOTER', 'NOTER')
35
+ before do
36
+ described_class.authorize('NOTER', 'NOTER', 'NOTER')
35
37
  end
36
38
 
37
- it 'should get data for a valid nmi' do
38
- nmi_detail_query = AEMO::MSATS.nmi_detail('4001234567')
39
+ it 'gets data for a valid nmi' do
40
+ nmi_detail_query = described_class.nmi_detail('4001234567')
39
41
  expect(nmi_detail_query.class).to eq(HTTParty::Response)
40
42
  end
41
43
  end
@@ -43,25 +45,26 @@ describe AEMO::MSATS do
43
45
 
44
46
  describe '#c4' do
45
47
  describe 'valid MSATS account' do
46
- before(:each) do
47
- AEMO::MSATS.authorize('ER', 'ER', 'ER')
48
+ before do
49
+ described_class.authorize('ER', 'ER', 'ER')
48
50
  end
49
51
 
50
- it 'should return a hash of information' do
51
- expect(AEMO::MSATS.c4('4001234567', Time.now, Time.now, Time.now)).to be_a(Hash)
52
+ it 'returns a hash of information' do
53
+ expect(described_class.c4('4001234567', Time.now, Time.now, Time.now)).to be_a(Hash)
52
54
  end
53
- it 'should raise an error for a bad nmi' do
54
- expect { AEMO::MSATS.c4('BOBISAFISH') }.to raise_error(ArgumentError)
55
+
56
+ it 'raises an error for a bad nmi' do
57
+ expect { described_class.c4('BOBISAFISH') }.to raise_error(ArgumentError)
55
58
  end
56
59
  end
57
60
 
58
61
  describe 'invalid MSATS account' do
59
- before(:each) do
60
- AEMO::MSATS.authorize('NOTER', 'NOTER', 'NOTER')
62
+ before do
63
+ described_class.authorize('NOTER', 'NOTER', 'NOTER')
61
64
  end
62
65
 
63
- it 'should return response' do
64
- expect(AEMO::MSATS.c4(
66
+ it 'returns response' do
67
+ expect(described_class.c4(
65
68
  '4001234567',
66
69
  Time.now,
67
70
  Time.now,
@@ -73,80 +76,89 @@ describe AEMO::MSATS do
73
76
 
74
77
  describe '#msats_limits' do
75
78
  describe 'valid MSATS user' do
76
- before(:each) do
77
- AEMO::MSATS.authorize('ER', 'ER', 'ER')
79
+ before do
80
+ described_class.authorize('ER', 'ER', 'ER')
78
81
  end
79
82
 
80
- it 'should give details of msats_limits' do
81
- expect(AEMO::MSATS.msats_limits.class).to eq(Hash)
83
+ it 'gives details of msats_limits' do
84
+ expect(described_class.msats_limits.class).to eq(Hash)
82
85
  end
83
86
  end
84
87
 
85
88
  describe 'invalid MSATS user' do
86
- before(:each) do
87
- AEMO::MSATS.authorize('NOTER', 'NOTER', 'NOTER')
89
+ before do
90
+ described_class.authorize('NOTER', 'NOTER', 'NOTER')
88
91
  end
89
92
 
90
- it 'should not give details of msats_limits' do
91
- expect(AEMO::MSATS.msats_limits.class).to eq(HTTParty::Response)
93
+ it 'does not give details of msats_limits' do
94
+ expect(described_class.msats_limits.class).to eq(HTTParty::Response)
92
95
  end
93
96
  end
94
97
  end
95
98
 
96
99
  describe '#nmi_discovery_by_*' do
97
100
  describe 'valid MSATS user' do
98
- before(:each) do
99
- AEMO::MSATS.authorize('ER', 'ER', 'ER')
101
+ before do
102
+ described_class.authorize('ER', 'ER', 'ER')
100
103
  end
101
- it 'should find by address' do
102
- expect(AEMO::MSATS.nmi_discovery_by_address('NSW', house_number: 6, street_name: 'Macquarie', suburb_or_place_or_locality: 'Sydney', postcode: 2000).class).to eq(Array)
104
+
105
+ it 'finds by address' do
106
+ expect(described_class.nmi_discovery_by_address('NSW', house_number: 6, street_name: 'Macquarie',
107
+ suburb_or_place_or_locality: 'Sydney', postcode: 2000).class).to eq(Array)
103
108
  end
104
- it 'should find by meter_serial_number' do
105
- expect(AEMO::MSATS.nmi_discovery_by_meter_serial_number('NSW', 666).class).to eq(Array)
109
+
110
+ it 'finds by meter_serial_number' do
111
+ expect(described_class.nmi_discovery_by_meter_serial_number('NSW', 666).class).to eq(Array)
106
112
  end
107
- it 'should find by meter_serial_number' do
108
- expect { AEMO::MSATS.nmi_discovery_by_delivery_point_identifier('NSW', 666) }.to raise_error(ArgumentError)
113
+
114
+ it 'finds by meter_serial_number' do
115
+ expect { described_class.nmi_discovery_by_delivery_point_identifier('NSW', 666) }.to raise_error(ArgumentError)
109
116
  end
110
- it 'should find by meter_serial_number' do
111
- expect(AEMO::MSATS.nmi_discovery_by_delivery_point_identifier('NSW', 10_000_001).class).to eq(Array)
117
+
118
+ it 'finds by meter_serial_number' do
119
+ expect(described_class.nmi_discovery_by_delivery_point_identifier('NSW', 10_000_001).class).to eq(Array)
112
120
  end
113
121
  end
114
122
 
115
123
  describe 'invalid MSATS user' do
116
- before(:each) do
117
- AEMO::MSATS.authorize('NOTER', 'NOTER', 'NOTER')
124
+ before do
125
+ described_class.authorize('NOTER', 'NOTER', 'NOTER')
118
126
  end
119
127
 
120
- it 'should find by address' do
121
- expect(AEMO::MSATS.nmi_discovery_by_address('NSW', house_number: 6, street_name: 'Macquarie', suburb_or_place_or_locality: 'Sydney', postcode: 2000).class).to eq(HTTParty::Response)
128
+ it 'finds by address' do
129
+ expect(described_class.nmi_discovery_by_address('NSW', house_number: 6, street_name: 'Macquarie',
130
+ suburb_or_place_or_locality: 'Sydney', postcode: 2000).class).to eq(HTTParty::Response)
122
131
  end
123
- it 'should find by meter_serial_number' do
124
- expect(AEMO::MSATS.nmi_discovery_by_meter_serial_number('NSW', 666).class).to eq(HTTParty::Response)
132
+
133
+ it 'finds by meter_serial_number' do
134
+ expect(described_class.nmi_discovery_by_meter_serial_number('NSW', 666).class).to eq(HTTParty::Response)
125
135
  end
126
- it 'should find by meter_serial_number' do
127
- expect(AEMO::MSATS.nmi_discovery_by_delivery_point_identifier('NSW', 10_000_001).class).to eq(HTTParty::Response)
136
+
137
+ it 'finds by meter_serial_number' do
138
+ expect(described_class.nmi_discovery_by_delivery_point_identifier('NSW',
139
+ 10_000_001).class).to eq(HTTParty::Response)
128
140
  end
129
141
  end
130
142
  end
131
143
 
132
144
  describe '#system_status' do
133
145
  describe 'valid MSATS user' do
134
- before(:each) do
135
- AEMO::MSATS.authorize('ER', 'ER', 'ER')
146
+ before do
147
+ described_class.authorize('ER', 'ER', 'ER')
136
148
  end
137
149
 
138
- it 'should provide a status' do
139
- AEMO::MSATS.system_status
150
+ it 'provides a status' do
151
+ described_class.system_status
140
152
  end
141
153
  end
142
154
 
143
155
  describe 'invalid MSATS user' do
144
- before(:each) do
145
- AEMO::MSATS.authorize('NOTER', 'NOTER', 'NOTER')
156
+ before do
157
+ described_class.authorize('NOTER', 'NOTER', 'NOTER')
146
158
  end
147
159
 
148
- it 'should provide a status' do
149
- expect(AEMO::MSATS.system_status.class).to eq(HTTParty::Response)
160
+ it 'provides a status' do
161
+ expect(described_class.system_status.class).to eq(HTTParty::Response)
150
162
  end
151
163
  end
152
164
  end
@@ -6,97 +6,208 @@ require 'json'
6
6
  describe AEMO::NEM12 do
7
7
  let(:json) { JSON.parse(fixture('nmi_checksum.json').read) }
8
8
 
9
- describe '::RECORD_INDICATORS' do
10
- it 'should be a hash' do
11
- expect(AEMO::NEM12::RECORD_INDICATORS.class).to eq(Hash)
9
+ describe '#parse_nem12' do
10
+ it 'rejects an empty NEM12 string' do
11
+ expect(described_class.parse_nem12('')).to eq([])
12
12
  end
13
13
  end
14
14
 
15
- describe '#nmi_identifier' do
16
- it 'returns the NMI identifier or nil' do
17
- Dir.entries(File.join(File.dirname(__FILE__), '..', '..', 'fixtures', 'NEM12'))
18
- .reject { |f| %w[. .. .DS_Store].include?(f) }
19
- .each do |file|
20
- AEMO::NEM12.parse_nem12_file(fixture(File.join('NEM12', file))).each do |nem12|
21
- expect(nem12.nmi_identifier).to be_a String
22
- end
15
+ describe '.parse_nem12_file' do
16
+ let(:files) do
17
+ Dir.entries(File.join(File.dirname(__FILE__), '..', '..', 'fixtures', 'NEM12')).reject do |f|
18
+ %w[. .. .DS_Store].include?(f)
19
+ end
20
+ end
21
+
22
+ it 'parses a file' do
23
+ files.each do |file|
24
+ expect(described_class.parse_nem12_file(fixture(File.join('NEM12', file))).length).not_to eq(0)
23
25
  end
24
26
  end
25
27
  end
26
28
 
27
- describe '#parse_nem12' do
28
- it 'should reject an empty NEM12 string' do
29
- expect(AEMO::NEM12.parse_nem12('')).to eq([])
29
+ describe '.parse_nem12_100' do
30
+ it 'raises datetime error' do
31
+ expect { described_class.parse_nem12_100('100,NEM12,666,CNRGYMDP,NEMMCO') }.to raise_error(ArgumentError)
32
+ end
33
+
34
+ it 'raises datetime error' do
35
+ expect do
36
+ described_class.parse_nem12_100('100,NEM12,666,CNRGYMDP,NEMMCO', strict: true)
37
+ end.to raise_error(ArgumentError)
38
+ end
39
+
40
+ it 'does not raise an error' do
41
+ expect { described_class.parse_nem12_100('100,NEM12,201603010000,CNRGYMDP,NEMMCO', strict: true) }.not_to raise_error
30
42
  end
31
43
  end
32
44
 
33
- describe '.parse_nem12_file' do
34
- it 'should parse a file' do
35
- Dir.entries(File.join(File.dirname(__FILE__), '..', '..', 'fixtures', 'NEM12')).reject { |f| %w[. .. .DS_Store].include?(f) }.each do |file|
36
- expect(AEMO::NEM12.parse_nem12_file(fixture(File.join('NEM12', file))).length).not_to eq(0)
45
+ describe '.to_nem12_csv' do
46
+ let(:now) { Time.parse('2023-04-05T06:07:08+10:00') }
47
+
48
+ context 'with empty nem12s' do
49
+ let(:nem12s) { [] }
50
+ let(:expected) { ['100,NEM12,202304050607,ENOSI,ENOSI', '900', ''].join("\r\n") }
51
+
52
+ before { Timecop.freeze(now) }
53
+ after { Timecop.return }
54
+
55
+ it 'returns expected' do
56
+ expect(described_class.to_nem12_csv(nem12s:)).to eq(expected)
37
57
  end
38
58
  end
39
- end
40
59
 
41
- describe '#parse_nem12_100' do
42
- it 'should raise datetime error' do
43
- expect { AEMO::NEM12.parse_nem12_100('100,NEM12,666,CNRGYMDP,NEMMCO') }.to raise_error(ArgumentError)
60
+ context 'with non-empty nem12s not containing flags' do
61
+ let(:nem12_filepath) do
62
+ File.join(File.dirname(__FILE__), '..', '..', 'fixtures', 'NEM12', 'NEM12#000000000000001#CNRGYMDP#NEMMCO.csv')
63
+ end
64
+ let(:nem12s) { described_class.parse_nem12_file(nem12_filepath) }
65
+ let(:expected) do
66
+ [
67
+ '100,NEM12,202304050607,ENOSI,ENOSI',
68
+ '200,NEM1201002,E1E2,E1,E1,N1,01002,KWH,30,',
69
+ '300,20050315,300.0,266.1,191.55,247.8,288.6,280.8,282.45,206.1,204.75,289.5,390.6,360.15,407.7,432.6,435.0,491.85,600.9,541.95,474.6,565.35,548.55,491.85,593.25,602.4,571.35,450.15,509.4,559.95,522.0,520.95,541.2,538.05,484.8,330.9,329.25,331.65,330.75,333.75,335.25,294.15,185.25,184.8,186.45,256.8,329.7,320.1,316.5,321.15,A,,,20050316014209,',
70
+ '200,NEM1201002,E1E2,E2,E2,N2,01002,KWH,30,',
71
+ '300,20050315,113.1,87.6,33.75,60.6,81.9,79.5,81.15,39.75,25.65,58.8,174.3,197.1,390.6,392.55,394.2,418.5,484.95,407.7,407.7,466.5,455.7,386.85,486.9,489.45,465.15,360.0,387.45,458.7,381.9,424.8,446.25,444.45,383.55,172.65,154.05,164.4,164.25,174.45,170.1,110.1,44.55,44.25,39.9,72.3,109.05,102.45,103.95,103.05,A,,,20050316014209,',
72
+ '200,NEM1201002,E1E2,E1,E1,N1,01002,KWH,30,',
73
+ '300,20050316,321.9,326.4,302.7,298.65,304.5,295.35,309.75,312.3,312.0,338.1,376.95,411.9,546.45,548.25,497.85,528.45,580.8,525.0,435.6,569.4,587.4,577.05,487.35,492.15,588.45,455.55,553.65,515.4,539.7,561.6,540.3,555.6,493.8,349.5,323.7,321.3,322.2,317.55,318.45,324.45,324.6,324.6,321.9,318.75,318.6,317.85,317.1,321.3,A,,,20050317032944,',
74
+ '200,NEM1201002,E1E2,E2,E2,N2,01002,KWH,30,',
75
+ '300,20050316,104.85,103.5,82.95,64.8,72.3,71.4,72.9,80.1,94.5,121.05,185.1,282.9,427.8,427.95,322.8,381.45,464.4,413.4,332.25,442.95,472.8,466.35,401.55,400.2,470.7,352.8,426.3,381.3,435.45,453.75,433.2,453.0,388.35,226.05,148.05,149.55,142.65,115.65,105.75,107.1,109.35,111.45,107.1,104.25,103.05,101.85,103.2,107.55,A,,,20050317032944,',
76
+ '200,NEM1201002,E1E2,E1,E1,N1,01002,KWH,30,',
77
+ '300,20050317,322.35,318.0,302.4,294.45,298.65,296.4,315.15,315.6,326.55,358.2,389.7,397.2,513.15,511.2,520.65,510.3,543.45,549.9,419.85,529.2,527.85,506.1,535.05,538.05,369.6,380.85,555.15,558.6,477.9,334.5,337.2,335.25,339.15,335.55,316.2,312.75,312.6,320.25,320.25,315.75,317.25,315.6,314.7,315.3,315.0,315.75,314.4,315.9,A,,,20050318014032,',
78
+ '200,NEM1201002,E1E2,E2,E2,N2,01002,KWH,30,',
79
+ '300,20050317,104.1,100.8,85.8,70.5,70.95,69.45,53.25,55.65,66.6,106.8,182.1,266.55,408.9,402.15,410.7,414.45,436.2,427.8,325.35,442.2,439.2,432.15,435.3,418.8,283.5,294.0,450.45,455.4,368.4,156.0,160.5,137.55,138.0,134.4,112.35,105.6,103.35,111.75,111.15,107.55,106.5,103.95,102.3,105.75,103.8,97.5,99.75,102.0,A,,,20050318014032,',
80
+ '200,NEM1201002,E1E2,E1,E1,N1,01002,KWH,30,',
81
+ '300,20050318,315.15,313.8,296.55,298.5,295.2,298.95,300.75,322.95,330.45,350.7,345.75,346.95,345.9,348.6,300.15,337.5,336.75,345.9,330.45,327.15,334.8,345.75,335.85,320.1,325.5,325.2,326.4,330.6,332.7,332.25,321.0,316.5,299.85,302.4,301.05,263.85,255.45,142.05,138.3,138.3,136.8,138.3,136.05,135.75,135.75,136.65,136.05,130.8,A,,,20050319014041,',
82
+ '200,NEM1201002,E1E2,E2,E2,N2,01002,KWH,30,',
83
+ '300,20050318,103.05,98.85,81.15,75.6,72.15,73.95,74.55,81.15,89.25,124.2,125.7,128.7,136.8,151.05,177.9,174.45,204.0,210.15,180.15,164.4,187.95,211.95,193.8,122.85,124.8,121.2,129.3,131.25,130.95,130.05,118.05,105.75,77.1,75.9,75.0,51.15,44.4,12.3,12.75,12.15,12.45,11.55,14.4,14.55,15.0,14.7,15.75,21.9,A,,,20050319014041,', '900',
84
+ ''
85
+ ].join("\r\n")
86
+ end
87
+
88
+ before { Timecop.freeze(now) }
89
+ after { Timecop.return }
90
+
91
+ it 'returns expected' do
92
+ expect(described_class.to_nem12_csv(nem12s:)).to eq(expected)
93
+ end
44
94
  end
45
- it 'should raise datetime error' do
46
- expect { AEMO::NEM12.parse_nem12_100('100,NEM12,666,CNRGYMDP,NEMMCO', strict: true) }.to raise_error(ArgumentError)
95
+
96
+ context 'with non-empty nem12s containing flags' do
97
+ let(:nem12_filepath) do
98
+ File.join(File.dirname(__FILE__), '..', '..', 'fixtures', 'NEM12', 'NEM12#000000000000004#CNRGYMDP#NEMMCO.csv')
99
+ end
100
+ let(:nem12s) { described_class.parse_nem12_file(nem12_filepath) }
101
+ let(:expected) do
102
+ [
103
+ '100,NEM12,202304050607,ENOSI,ENOSI',
104
+ '200,NEM1204062,E1,E1,E1,N1,04062,KWH,30,20050503',
105
+ '300,20040527,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.735,0.625,0.618,0.63,0.893,1.075,1.263,1.505,1.645,1.073,0.938,1.15,0.75,1.35,1.093,0.973,1.018,0.735,0.718,0.735,0.64,0.638,0.65,0.645,0.73,0.63,0.673,0.688,0.663,0.625,0.628,0.628,0.633,0.645,0.625,0.62,0.623,0.78,V,,,20040609153903,',
106
+ '400,1,10,F52,71,',
107
+ '400,11,48,E52,,',
108
+ '200,NEM1204062,E1,E1,E1,N1,04062,KWH,30,20050503',
109
+ '300,20040528,0.68,0.653,0.62,0.623,0.618,0.625,0.613,0.623,0.618,0.615,0.613,0.76,0.665,0.638,0.61,0.648,0.65,0.645,0.895,0.668,0.645,0.648,0.655,0.73,0.695,0.67,0.638,0.643,0.64,0.723,0.653,0.645,0.633,0.71,0.683,0.648,0.625,0.63,0.625,0.63,0.638,0.635,0.633,0.638,0.673,0.765,0.65,0.628,V,,,20040609000001,',
110
+ '400,1,48,E52,,',
111
+ '200,NEM1204062,E1,E1,E1,N1,04062,KWH,30,20050503',
112
+ '300,20040529,0.633,0.613,0.628,0.618,0.625,0.623,0.623,0.613,0.655,0.663,0.645,0.708,0.608,0.618,0.63,0.625,0.62,0.635,0.63,0.638,0.693,0.71,0.683,0.645,0.638,0.653,0.653,0.648,0.655,0.745,0.69,0.695,0.68,0.643,0.645,0.635,0.628,0.625,0.635,0.628,0.673,0.688,0.685,0.66,0.638,0.718,0.638,0.63,V,,,20040609000001,',
113
+ '400,1,48,E52,,',
114
+ '900',
115
+ ''
116
+ ].join("\r\n")
117
+ end
118
+
119
+ before { Timecop.freeze(now) }
120
+ after { Timecop.return }
121
+
122
+ it 'returns expected' do
123
+ expect(described_class.to_nem12_csv(nem12s:)).to eq(expected)
124
+ end
47
125
  end
48
- it 'should not raise an error' do
49
- expect { AEMO::NEM12.parse_nem12_100('100,NEM12,201603010000,CNRGYMDP,NEMMCO', strict: true) }.not_to raise_error
126
+ end
127
+
128
+ describe '::RECORD_INDICATORS' do
129
+ it 'is a hash' do
130
+ expect(AEMO::NEM12::RECORD_INDICATORS.class).to eq(Hash)
131
+ end
132
+ end
133
+
134
+ describe '#nmi_identifier' do
135
+ it 'returns the NMI identifier or nil' do
136
+ Dir.entries(File.join(File.dirname(__FILE__), '..', '..', 'fixtures', 'NEM12'))
137
+ .reject { |f| %w[. .. .DS_Store].include?(f) }
138
+ .each do |file|
139
+ described_class.parse_nem12_file(fixture(File.join('NEM12', file))).each do |nem12|
140
+ expect(nem12.nmi_identifier).to be_a String
141
+ end
142
+ end
50
143
  end
51
144
  end
52
145
 
53
146
  describe '#parse_nem12_200' do
54
147
  context 'non-strict mode' do
55
- it 'should not raise validation warning with bad NMI configuration' do
56
- expect(AEMO::NEM12.parse_nem12_file(fixture(File.join('NEM12-Errors', 'NEM12#DerpyNMIConfig#CNRGYMDP#NEMMCO.csv')), false))
148
+ it 'does not raise validation warning with bad NMI configuration' do
149
+ expect(described_class.parse_nem12_file(
150
+ fixture(File.join('NEM12-Errors', 'NEM12#DerpyNMIConfig#CNRGYMDP#NEMMCO.csv')), strict: false
151
+ ))
57
152
  .to be_truthy
58
153
  end
59
154
  end
60
155
 
61
156
  context 'strict mode (default)' do
62
- it 'should raise validation warning with bad NMI configuration' do
63
- expect { AEMO::NEM12.parse_nem12_file(fixture(File.join('NEM12-Errors', 'NEM12#DerpyNMIConfig#CNRGYMDP#NEMMCO.csv'))) }
157
+ it 'raises validation warning with bad NMI configuration' do
158
+ expect do
159
+ described_class.parse_nem12_file(fixture(File.join('NEM12-Errors', 'NEM12#DerpyNMIConfig#CNRGYMDP#NEMMCO.csv')))
160
+ end
64
161
  .to raise_error(ArgumentError, 'NMIConfiguration is not valid')
65
162
  end
66
163
  end
67
164
  end
68
165
 
69
166
  describe '#parse_nem12_300' do
70
- it 'should raise invalid record length error' do
167
+ it 'raises invalid record length error' do
71
168
  bad_file = fixture(File.join('NEM12-Errors', 'NEM12#InvalidIntervalDataLength#CNRGYMDP#NEMMCO.csv'))
72
- expect { AEMO::NEM12.parse_nem12_file(bad_file) }.to raise_error(TypeError, 'Invalid record length')
169
+ expect { described_class.parse_nem12_file(bad_file) }.to raise_error(TypeError, 'Invalid record length')
73
170
  end
74
171
 
75
- it 'should raise argument error on 300 empty cells' do
172
+ it 'raises argument error on 300 empty cells' do
76
173
  nem12_empty_cells_300_record = fixture(File.join('NEM12-Errors', 'NEM12#EmptyCells300Record#CNRGYMDP#NEMMCO.csv'))
77
- expect { AEMO::NEM12.parse_nem12_file(nem12_empty_cells_300_record) }.to raise_error(ArgumentError)
174
+ expect { described_class.parse_nem12_file(nem12_empty_cells_300_record) }.to raise_error(ArgumentError)
78
175
  end
79
176
  end
80
177
 
81
178
  describe '#parse_nem12_400' do
82
- it 'should raise argument error on 400 empty cells' do
179
+ it 'raises argument error on 400 empty cells' do
83
180
  nem12_empty_cells_400_record = fixture(File.join('NEM12-Errors', 'NEM12#EmptyCells400Record#CNRGYMDP#NEMMCO.csv'))
84
- expect { AEMO::NEM12.parse_nem12_file(nem12_empty_cells_400_record) }.to raise_error(ArgumentError)
181
+ expect { described_class.parse_nem12_file(nem12_empty_cells_400_record) }.to raise_error(ArgumentError)
85
182
  end
86
183
  end
87
184
 
88
- describe '#parse_nem12_500' do
89
- end
90
-
91
- describe '#parse_nem12_900' do
92
- end
93
-
94
185
  describe '#flag_to_s' do
95
186
  it 'converts the flags to a string' do
96
187
  flag = { quality_flag: 'S', method_flag: 11, reason_code: 53 }
97
- nem12 = AEMO::NEM12.new('NEEE000010')
188
+ nem12 = described_class.new('NEEE000010')
98
189
  expect(nem12.flag_to_s(flag))
99
190
  .to eq 'Substituted Data - Check - Bees/Wasp In Meter Box'
100
191
  end
101
192
  end
193
+
194
+ describe '#to_nem12_csv' do
195
+ let(:nem12_filepath) do
196
+ File.join(File.dirname(__FILE__), '..', '..', 'fixtures', 'NEM12', 'NEM12#000000000000004#CNRGYMDP#NEMMCO.csv')
197
+ end
198
+ let(:nem12) { described_class.parse_nem12_file(nem12_filepath).first }
199
+ let(:expected) do
200
+ "100,NEM12,200505121137,CNRGYMDP,NEMMCO\r
201
+ 200,NEM1204062,E1,E1,E1,N1,04062,KWH,30,20050503\r
202
+ 300,20040527,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.735,0.625,0.618,0.63,0.893,1.075,1.263,1.505,1.645,1.073,0.938,1.15,0.75,1.35,1.093,0.973,1.018,0.735,0.718,0.735,0.64,0.638,0.65,0.645,0.73,0.63,0.673,0.688,0.663,0.625,0.628,0.628,0.633,0.645,0.625,0.62,0.623,0.78,V,,,20040609153903,\r
203
+ 400,1,10,F52,71,\r
204
+ 400,11,48,E52,,\r
205
+ 900\r
206
+ "
207
+ end
208
+
209
+ it 'returns a correct NEM12 file' do
210
+ expect(nem12.to_nem12_csv).to eq(expected)
211
+ end
212
+ end
102
213
  end
@@ -7,21 +7,21 @@ describe AEMO::NMI::Allocation do
7
7
  # CLASS METHODS
8
8
  # ---
9
9
  describe '.all' do
10
- it 'should return an array of all the Allocations' do
11
- expect(AEMO::NMI::Allocation.all).to be_a Array
12
- expect(AEMO::NMI::Allocation.all.first).to be_a AEMO::NMI::Allocation
10
+ it 'returns an array of all the Allocations' do
11
+ expect(described_class.all).to be_a Array
12
+ expect(described_class.all.first).to be_a described_class
13
13
  end
14
14
  end
15
15
 
16
16
  describe '.each' do
17
- it 'should return an enumerable of all the Allocations' do
18
- expect(AEMO::NMI::Allocation.each).to be_a Enumerable
17
+ it 'returns an enumerable of all the Allocations' do
18
+ expect(described_class.each).to be_a Enumerable
19
19
  end
20
20
  end
21
21
 
22
22
  describe '.first' do
23
- it 'should return the first Allocation' do
24
- expect(AEMO::NMI::Allocation.first).to be_a AEMO::NMI::Allocation
23
+ it 'returns the first Allocation' do
24
+ expect(described_class.first).to be_a described_class
25
25
  end
26
26
  end
27
27
 
@@ -30,20 +30,25 @@ describe AEMO::NMI::Allocation do
30
30
  # ---
31
31
  describe '#initialize' do
32
32
  context 'valid' do
33
- it 'should return an Allocation' do
34
- expect(AEMO::NMI::Allocation.new('My great LNSP', :electricity)).to be_a AEMO::NMI::Allocation
35
- expect(AEMO::NMI::Allocation.new('My great LNSP', 'electricity')).to be_a AEMO::NMI::Allocation
36
- expect(AEMO::NMI::Allocation.new('My great gas LNSP', :gas)).to be_a AEMO::NMI::Allocation
37
- expect(AEMO::NMI::Allocation.new('My great gas LNSP', 'gas')).to be_a AEMO::NMI::Allocation
33
+ it 'returns an Allocation' do
34
+ expect(described_class.new('My great LNSP', :electricity)).to be_a described_class
35
+ expect(described_class.new('My great LNSP', 'electricity')).to be_a described_class
36
+ expect(described_class.new('My great gas LNSP', :gas)).to be_a described_class
37
+ expect(described_class.new('My great gas LNSP', 'gas')).to be_a described_class
38
38
  end
39
39
  end
40
+
40
41
  context 'invalid' do
41
- it 'should raise an InvalidNMIAllocationType error' do
42
- expect { AEMO::NMI::Allocation.new('My terrible LNSP', :water) }.to raise_error AEMO::InvalidNMIAllocationType
43
- expect { AEMO::NMI::Allocation.new('My terrible LNSP', :broccoli) }.to raise_error AEMO::InvalidNMIAllocationType
44
- expect { AEMO::NMI::Allocation.new('My terrible LNSP', 'Ch4') }.to raise_error AEMO::InvalidNMIAllocationType
45
- expect { AEMO::NMI::Allocation.new('My terrible LNSP', 'Natural gas') }.to raise_error AEMO::InvalidNMIAllocationType
46
- expect { AEMO::NMI::Allocation.new('My terrible LNSP', :coal) }.to raise_error AEMO::InvalidNMIAllocationType
42
+ it 'raises an InvalidNMIAllocationType error' do
43
+ expect { described_class.new('My terrible LNSP', :water) }.to raise_error AEMO::InvalidNMIAllocationType
44
+ expect do
45
+ described_class.new('My terrible LNSP', :broccoli)
46
+ end.to raise_error AEMO::InvalidNMIAllocationType
47
+ expect { described_class.new('My terrible LNSP', 'Ch4') }.to raise_error AEMO::InvalidNMIAllocationType
48
+ expect do
49
+ described_class.new('My terrible LNSP', 'Natural gas')
50
+ end.to raise_error AEMO::InvalidNMIAllocationType
51
+ expect { described_class.new('My terrible LNSP', :coal) }.to raise_error AEMO::InvalidNMIAllocationType
47
52
  end
48
53
  end
49
54
  end