Skip to content

Commit

Permalink
Merge pull request #30 from Jaimies/refactor/better_handling_of_uknow…
Browse files Browse the repository at this point in the history
…n_segments

Improve the handling of unknown segments
  • Loading branch information
Chemaclass committed Nov 9, 2022
2 parents e395e5a + f402c66 commit ef62cd9
Show file tree
Hide file tree
Showing 3 changed files with 112 additions and 6 deletions.
20 changes: 17 additions & 3 deletions src/Segments/UnknownSegment.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@

namespace EdifactParser\Segments;

use function is_string;

/** @psalm-immutable */
final class UnknownSegment implements SegmentInterface
{
Expand All @@ -16,18 +18,30 @@ public function __construct(array $rawValues)

public function tag(): string
{
return 'Unknown';
return $this->rawValues[0];
}

public function subId(): string
{
$encodedValues = json_encode($this->rawValues);
if (is_string($this->rawValues[1])) {
return $this->rawValues[1];
}

return ($encodedValues) ? md5($encodedValues) : md5(self::class);
if (is_string($this->rawValues[1][0])) {
return $this->rawValues[1][0];
}

return $this->hashContentsWithMD5();
}

public function rawValues(): array
{
return $this->rawValues;
}

private function hashContentsWithMD5(): string
{
$encodedValues = json_encode($this->rawValues);
return ($encodedValues) ? md5($encodedValues) : md5(self::class);
}
}
45 changes: 45 additions & 0 deletions tests/Functional/EdifactParserTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -105,4 +105,49 @@ public function use_a_custom_segment_factory(): void
$cnt11 = $message->segmentByTagAndSubId('CNT', '11');
self::assertEquals(['CNT', ['11', '1', 'PCE']], $cnt11->rawValues());
}

/**
* @test
*/
public function handles_unknown_segments(): void
{
$fileContent = <<<EDI
UNA:+.? '
UNH+1+IFTMIN:S:93A:UN:PN001'
UNK+first+23'
UNK+second+52'
CNT+11:1:PCE'
UNT+19+1'
UNZ+1+3'
EDI;
$transactionResult = EdifactParser::createWithDefaultSegments()->parse($fileContent);
$message = $transactionResult[0];

self::assertNotNull($message->segmentByTagAndSubId('UNK', 'first'));
self::assertNotNull($message->segmentByTagAndSubId('UNK', 'second'));
}

/**
* @test
*/
public function handles_unknown_segments_in_line_items(): void
{
$fileContent = <<<EDI
UNA:+.? '
UNH+1+IFTMIN:S:93A:UN:PN001'
LIN+1'
UNK+first+23'
LIN+2'
UNK+first+13'
UNS+S'
CNT+11:1:PCE'
UNT+19+1'
UNZ+1+3'
EDI;
$transactionResult = EdifactParser::createWithDefaultSegments()->parse($fileContent);
$message = $transactionResult[0];

self::assertNotNull($message->lineItems()[1]['UNK']['first']);
self::assertNotNull($message->lineItems()[2]['UNK']['first']);
}
}
53 changes: 50 additions & 3 deletions tests/Unit/Segments/UnknownSegmentTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,58 @@ final class UnknownSegmentTest extends TestCase
*/
public function segment_values(): void
{
$rawValues = ['UNKNOWN', 'SEGMENT'];
$rawValues = ['UNKNOWN', ['some_sub_id', 'data', 'more_data']];
$segment = new UnknownSegment($rawValues);

self::assertEquals('Unknown', $segment->tag());
self::assertEquals(md5(json_encode($rawValues)), $segment->subId());
self::assertEquals('UNKNOWN', $segment->tag());
self::assertEquals('some_sub_id', $segment->subId());
self::assertEquals($rawValues, $segment->rawValues());
}

/**
* @test
*/
public function tag_always_returns_first_value(): void
{
self::assertEquals(
'TAG',
(new UnknownSegment(['TAG', 'sub_id']))->tag()
);
self::assertEquals(
'other_tag',
(new UnknownSegment(['other_tag', 'sub_id']))->tag()
);
self::assertEquals(
'THETAG',
(new UnknownSegment(['THETAG', 'sub_id']))->tag()
);
}

/**
* @test
*/
public function sub_id_infers_sub_id_if_present(): void
{
self::assertEquals(
'other_sub_id',
(new UnknownSegment(['unknown', 'other_sub_id']))->subId()
);

self::assertEquals(
'yet_another_sub_id',
(new UnknownSegment(['unknown', ['yet_another_sub_id']]))->subId()
);
}

/**
* @test
*/
public function sub_id_returns_hash_if_no_sub_id_present(): void
{
$rawValues = ['unknown', [['other_sub_id']]];
self::assertEquals(
md5(json_encode($rawValues)),
(new UnknownSegment($rawValues))->subId()
);
}
}

0 comments on commit ef62cd9

Please sign in to comment.