|
6 | 6 | import pytest |
7 | 7 |
|
8 | 8 | from sift_client.sift_types import Channel |
9 | | -from sift_client.sift_types.channel import ChannelDataType |
| 9 | +from sift_client.sift_types.channel import ChannelDataType, ChannelReference |
10 | 10 |
|
11 | 11 |
|
12 | 12 | @pytest.fixture |
@@ -104,6 +104,100 @@ def test_data_method_as_arrow(self, mock_channel, mock_client): |
104 | 104 | mock_client.channels.get_data.assert_not_called() |
105 | 105 | assert result == mock_data |
106 | 106 |
|
| 107 | + def test_channel_reference_requires_one_target(self): |
| 108 | + """ChannelReference must specify exactly one of identifier or calculated_channel.""" |
| 109 | + with pytest.raises(ValueError, match="exactly one"): |
| 110 | + ChannelReference(channel_reference="$1") |
| 111 | + with pytest.raises(ValueError, match="exactly one"): |
| 112 | + ChannelReference( |
| 113 | + channel_reference="$1", |
| 114 | + channel_identifier="ch", |
| 115 | + calculated_channel="v-id", |
| 116 | + ) |
| 117 | + |
| 118 | + def test_channel_reference_accepts_version_id_string(self): |
| 119 | + """A plain version_id string is stored as-is.""" |
| 120 | + ref = ChannelReference(channel_reference="$1", calculated_channel="v-abc") |
| 121 | + assert ref.calculated_channel == "v-abc" |
| 122 | + assert ref.channel_identifier is None |
| 123 | + |
| 124 | + def test_channel_reference_accepts_calculated_channel_object(self): |
| 125 | + """Passing a CalculatedChannel normalizes to its version_id string.""" |
| 126 | + from sift_client.sift_types.calculated_channel import CalculatedChannel |
| 127 | + |
| 128 | + cc = CalculatedChannel( |
| 129 | + proto=MagicMock(), |
| 130 | + id_="cc-id", |
| 131 | + name="parent", |
| 132 | + description="", |
| 133 | + expression="$1", |
| 134 | + channel_references=[], |
| 135 | + is_archived=False, |
| 136 | + units=None, |
| 137 | + asset_ids=["asset-1"], |
| 138 | + tag_ids=None, |
| 139 | + all_assets=False, |
| 140 | + organization_id=None, |
| 141 | + client_key=None, |
| 142 | + archived_date=None, |
| 143 | + version_id="v-abc", |
| 144 | + version=1, |
| 145 | + change_message=None, |
| 146 | + user_notes=None, |
| 147 | + created_date=datetime.now(timezone.utc), |
| 148 | + modified_date=datetime.now(timezone.utc), |
| 149 | + created_by_user_id="u", |
| 150 | + modified_by_user_id="u", |
| 151 | + ) |
| 152 | + |
| 153 | + ref = ChannelReference(channel_reference="$1", calculated_channel=cc) |
| 154 | + assert ref.calculated_channel == "v-abc" |
| 155 | + |
| 156 | + def test_channel_reference_rejects_calculated_channel_without_version_id(self): |
| 157 | + """A CalculatedChannel missing version_id is unusable as a reference.""" |
| 158 | + from sift_client.sift_types.calculated_channel import CalculatedChannel |
| 159 | + |
| 160 | + cc = CalculatedChannel( |
| 161 | + proto=MagicMock(), |
| 162 | + id_="cc-id", |
| 163 | + name="parent", |
| 164 | + description="", |
| 165 | + expression="$1", |
| 166 | + channel_references=[], |
| 167 | + is_archived=False, |
| 168 | + units=None, |
| 169 | + asset_ids=["asset-1"], |
| 170 | + tag_ids=None, |
| 171 | + all_assets=False, |
| 172 | + organization_id=None, |
| 173 | + client_key=None, |
| 174 | + archived_date=None, |
| 175 | + version_id=None, |
| 176 | + version=None, |
| 177 | + change_message=None, |
| 178 | + user_notes=None, |
| 179 | + created_date=datetime.now(timezone.utc), |
| 180 | + modified_date=datetime.now(timezone.utc), |
| 181 | + created_by_user_id="u", |
| 182 | + modified_by_user_id="u", |
| 183 | + ) |
| 184 | + |
| 185 | + with pytest.raises(ValueError, match="no version_id"): |
| 186 | + ChannelReference(channel_reference="$1", calculated_channel=cc) |
| 187 | + |
| 188 | + def test_channel_reference_from_proto_reads_version_id_oneof(self): |
| 189 | + """_from_proto picks calculated_channel when the proto oneof selects it.""" |
| 190 | + from sift.calculated_channels.v2.calculated_channels_pb2 import ( |
| 191 | + CalculatedChannelAbstractChannelReference, |
| 192 | + ) |
| 193 | + |
| 194 | + proto = CalculatedChannelAbstractChannelReference( |
| 195 | + channel_reference="$1", calculated_channel_version_id="v-abc" |
| 196 | + ) |
| 197 | + ref = ChannelReference._from_proto(proto) |
| 198 | + assert ref.calculated_channel == "v-abc" |
| 199 | + assert ref.channel_identifier is None |
| 200 | + |
107 | 201 | def test_data_method_with_minimal_params(self, mock_channel, mock_client): |
108 | 202 | """Test that data() method works with minimal parameters.""" |
109 | 203 | mock_data = {"test_channel": MagicMock()} |
|
0 commit comments